ความแตกต่างของการเปลี่ยนเส้นทางระหว่าง &>> & กับ 2> & 1


12

ในเธรด SO นี้และเธรดอื่น ๆ ฉันเห็นคำสั่งต่อไปนี้สำหรับการเปลี่ยนเส้นทางstdoutและstderrไปยังไฟล์

พวกเขาทั้งหมดเทียบเท่าหรือไม่ มีความแตกต่างระหว่างพวกเขาหรือไม่?

command1 >> logfile 2>&1
command &> logfile
command >& logfile

1
สองคนสุดท้ายนั้น
เท่าเทียม

คำตอบ:


7

เมื่อคุณติดแท็ก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 (ถ้าไม่ว่าง)


1
คุณหมายถึงshอะไร ถ้าเป็น POSIX เชลล์&>และ>&จะไม่ทำงาน
cuonglm

น่าเสียดายที่ข้อความแรกไม่ถูกต้องตามข้อเท็จจริง ดูคำตอบของฉันสำหรับ clobber เทียบกับผนวก
Tom Hale

1

&>และ>&กึ่งสมมูล (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อนุญาตให้ทั้งสอง&>>และ>>&รูปแบบ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.