ในเธรด SO นี้และเธรดอื่น ๆ ฉันเห็นคำสั่งต่อไปนี้สำหรับการเปลี่ยนเส้นทางstdout
และstderr
ไปยังไฟล์
พวกเขาทั้งหมดเทียบเท่าหรือไม่ มีความแตกต่างระหว่างพวกเขาหรือไม่?
command1 >> logfile 2>&1
command &> logfile
command >& logfile
ในเธรด SO นี้และเธรดอื่น ๆ ฉันเห็นคำสั่งต่อไปนี้สำหรับการเปลี่ยนเส้นทางstdout
และstderr
ไปยังไฟล์
พวกเขาทั้งหมดเทียบเท่าหรือไม่ มีความแตกต่างระหว่างพวกเขาหรือไม่?
command1 >> logfile 2>&1
command &> logfile
command >& logfile
คำตอบ:
เมื่อคุณติดแท็กzsh
ฉันจะบอกให้คุณทราบว่าการเปลี่ยนเส้นทางทั้ง 3 รายการทำงานในลักษณะเดียวกัน เนื่องจากคุณอาจได้อ่านทั้งโพสต์ที่ซ้ำกัน (โพสต์ในความคิดเห็นและโพสต์ในโพสต์ของคุณ), พวกเขาทั้งหมดเปลี่ยนเส้นทางstderr
ไปstdout
ที่ inturn ที่ถูกเปลี่ยนเส้นทางไปยังไฟล์ 'logfile' (เช่น logfile จะมีทั้งเอาต์พุตและข้อผิดพลาด) )
แต่พฤติกรรมของพวกเขาเปลี่ยนไปมากขึ้นอยู่กับเชลล์ที่คุณอยู่
การเปลี่ยนเส้นทางทั้งสามรูปแบบทำงานได้ดีในลักษณะเดียวกันกับbash
และzsh
แต่:
>&
ใช้ได้เฉพาะในcsh
หรือtcsh
[soum@server ~]$ ./test.sh > logfile 2>&1
Ambiguous output redirect.
[soum@server ~]$ ./test.sh &> logfile
Invalid null command.
[soum@server ~]$ ./test.sh >& logfile
[soum@server ~]$ echo $SHELL
/bin/tcsh
[soum@server ~]$
ในงานksh
เท่านั้น2>&1
$ ./test.sh >& logfile
-ksh: logfile: bad file unit number
$ ./test.sh &> logfile
[1] 23039
$ 1 2 3 4 5 6 logfile test.sh
ls: cannot access ttr: No such file or directory
[1] + Done(2) ./test.sh &> logfile
ksh
ฉันเกลียดชัง ในขณะที่>&
เพิ่งให้ข้อผิดพลาด&>
พื้นหลังเป็นส่วนหนึ่งของคำสั่งและล้าง logfile (ถ้าไม่ว่าง)
sh
อะไร ถ้าเป็น POSIX เชลล์&>
และ>&
จะไม่ทำงาน
&>
และ>&
กึ่งสมมูล (clobber)ส่วนการzsh
เปลี่ยนเส้นทางด้วยตนเองบอกว่า:
&>
>&
เทียบเท่า
ทั้งสองจะอุดตันไฟล์ - ตัดไฟล์เป็น 0 ไบต์ก่อนที่จะเขียนไปเช่นเดียวกับที่> file
ทำในกรณี STDIN เท่านั้น
อย่างไรก็ตามในbash
คู่มือส่วนการเปลี่ยนเส้นทางเสริมว่า:
ของทั้งสองรูปแบบเป็นที่ต้องการแรก สิ่งนี้เทียบเท่ากับความหมาย
>word 2>&1
เมื่อมีการใช้รูปแบบที่สองคำ
-
อาจจะไม่ขยายไปยังหมายเลขหรือ หากเป็นเช่นนั้นตัวดำเนินการเปลี่ยนเส้นทางอื่นจะมีผล (ดูที่การทำซ้ำตัวอธิบายไฟล์ด้านล่าง) เพื่อเหตุผลด้านความเข้ากันได้
ดังนั้นในขณะที่คุณติดแท็กzsh
อาจเป็นวิธีที่ดีที่จะได้หน่วยความจำนิ้วในรูปแบบแรกที่ควรเขียนbash
สคริปต์
>> logfile 2>&1
และความ&>>
เท่าเทียม (ผนวก)ที่นี่logfile
ไม่ถูกเขียนทับ แต่เปิดสำหรับการเขียนในตอนท้ายของไฟล์เช่นโหมดผนวก ( O_APPEND
)
เทียบเท่าในทั้งสอง{ba,z}sh
คือ:
command1 &>> logfile
ในbash
:
รูปแบบสำหรับการต่อท้ายเอาต์พุตมาตรฐานและข้อผิดพลาดมาตรฐานคือ:
&>>word
สิ่งนี้เทียบเท่ากับความหมาย
>>word 2>&1
(ดูตัวทำซ้ำไฟล์อธิบายด้านล่าง)
(หมายเหตุ: แนะนำให้ใช้การปิด&>
ทับ>&
ของส่วนบนในส่วนด้านบนอีกครั้งเนื่องจากมีเพียงวิธีเดียวในการต่อท้ายbash
)
zsh
อนุญาตให้ทั้งสอง&>>
และ>>&
รูปแบบ