หน้าคนทุบตีกล่าวถึงมีสองวิธีที่จะเปลี่ยนเส้นทางstderr และ stdout :
และ&> file
>& file
ตอนนี้สังเกตว่ามันบอกว่าทั้ง stderr และ stdout
ในกรณีนี้>file 2>&1
เรากำลังทำการเปลี่ยนเส้นทางของ stdout (1) ไปยังไฟล์ แต่ก็บอก stderr (2) ให้เปลี่ยนเส้นทางไปยังสถานที่เดียวกันกับ stdout! ดังนั้นจุดประสงค์อาจเหมือนกัน แต่ความคิดแตกต่างกันเล็กน้อย กล่าวอีกนัยหนึ่งว่า "จอห์นไปโรงเรียน; ซูซี่ไปที่จอห์นไป"
แล้วความชอบล่ะ? &>
เป็นbash
สิ่ง ดังนั้นหากคุณกำลังย้ายสคริปต์มันจะไม่ทำ แต่ถ้าคุณมั่นใจ 100% สคริปต์ของคุณจะทำงานเฉพาะในระบบที่มีการทุบตีเท่านั้น - ไม่มีการตั้งค่าใด ๆ
นี่คือตัวอย่างdash
ของ Debian Amquist Shell ซึ่งเป็นค่าเริ่มต้นของ Ubuntu
$ grep "YOLO" * &> /dev/null
$ grep: Desktop: Is a directory
grep: Documents: Is a directory
grep: Downloads: Is a directory
grep: Music: Is a directory
grep: Pictures: Is a directory
grep: Public: Is a directory
grep: Templates: Is a directory
grep: Videos: Is a directory
grep: YOLO: Is a directory
grep: bin: Is a directory
อย่างที่คุณเห็น stderr ไม่ได้ถูกเปลี่ยนเส้นทาง
หากต้องการแก้ไขการแก้ไขของคุณคุณสามารถใช้คำสั่ง if เพื่อตรวจสอบตัวแปร $ SHELL และเปลี่ยนการเปลี่ยนเส้นทางตามนั้น
แต่สำหรับกรณีส่วนใหญ่> file 2>&1
ควรทำงาน
ในแง่เทคนิคเพิ่มเติมฟอร์ม[integer]>&word
เรียกว่าDuplicating Output File Descriptorและเป็นคุณสมบัติที่ระบุโดยมาตรฐานภาษาคำสั่งเชลล์ POSIX ซึ่งได้รับการสนับสนุนโดย POSIX-compliant และเชลล์คล้าย Brourne ส่วนใหญ่
ดูสิ่งที่ & หมายถึงอะไรกันแน่ในการเปลี่ยนเส้นทางเอาต์พุต