ในเธรด 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อนุญาตให้ทั้งสอง&>>และ>>&รูปแบบ