ขั้นแรกให้สังเกตว่าไวยากรณ์สำหรับการปิดคือ5>&-
หรือ6<&-
ขึ้นอยู่กับว่าไฟล์ descriptor กำลังอ่านเพื่อการเขียนหรือสำหรับการอ่าน ดูเหมือนว่ามีการพิมพ์ผิดหรือการจัดรูปแบบความผิดพลาดในบล็อกโพสต์นั้น
นี่คือสคริปต์ที่แสดงความคิดเห็น
exec 5>/tmp/foo # open /tmp/foo for writing, on fd 5
exec 6</tmp/bar # open /tmp/bar for reading, on fd 6
cat <&6 | # call cat, with its standard input connected to
# what is currently fd 6, i.e., /tmp/bar
while read a; do #
echo $a >&5 # write to fd 5, i.e., /tmp/foo
done #
ไม่มีการปิดที่นี่ เนื่องจากอินพุตและเอาต์พุตทั้งหมดกำลังไปยังตำแหน่งเดียวกันในตัวอย่างง่าย ๆ นี้การใช้ตัวอธิบายไฟล์เพิ่มเติมจึงไม่จำเป็น คุณสามารถเขียน
cat </tmp/bar |
while read a; do
echo $a
done >/tmp/foo
การใช้ตัวอธิบายไฟล์อย่างชัดเจนจะมีประโยชน์เมื่อคุณต้องการเขียนไปยังหลาย ๆ ไฟล์ ตัวอย่างเช่นพิจารณาสคริปต์ที่เอาต์พุตข้อมูลไปยังไฟล์เอาต์พุตข้อมูลและข้อมูลการบันทึกไปยังล็อกไฟล์และอาจมีข้อความแสดงข้อผิดพลาดเช่นกัน นั่นหมายถึงช่องสัญญาณออกสามช่อง: ช่องหนึ่งสำหรับข้อมูลช่องหนึ่งสำหรับบันทึกและอีกช่องสำหรับข้อผิดพลาด เนื่องจากมีเพียงสอง descriptor มาตรฐานสำหรับเอาต์พุตจึงจำเป็นต้องใช้ตัวที่สาม คุณสามารถเรียกexec
เพื่อเปิดไฟล์เอาต์พุต:
exec >data-file
exec 3>log-file
echo "first line of data"
echo "this is a log line" >&3
…
if something_bad_happens; then echo error message >&2; fi
exec >&- # close the data output file
echo "output file closed" >&3
หมายเหตุเกี่ยวกับประสิทธิภาพเกิดขึ้นเมื่อคุณมีการเปลี่ยนเส้นทางในลูปเช่นนี้ (ถือว่าไฟล์ว่างเปล่าเพื่อเริ่มต้นด้วย):
while …; do echo $a >>/tmp/bar; done
ในการวนซ้ำแต่ละครั้งโปรแกรมจะเปิดขึ้น/tmp/bar
เพื่อค้นหาที่ส่วนท้ายของไฟล์ผนวกข้อมูลบางส่วนและปิดไฟล์ มันจะมีประสิทธิภาพมากขึ้นในการเปิดไฟล์ทันที:
while …; do echo $a; done >/tmp/bar
เมื่อมีการเปลี่ยนเส้นทางหลายครั้งเกิดขึ้นในช่วงเวลาที่แตกต่างกันการโทรexec
เพื่อทำการเปลี่ยนเส้นทางมากกว่าการปิดกั้นบล็อกในการเปลี่ยนเส้นทางจะมีประโยชน์
exec >/tmp/bar
while …; do echo $a; done
คุณจะพบตัวอย่างio-redirection
อื่น ๆของการเปลี่ยนเส้นทางโดยเรียกดูแท็กในไซต์นี้