& หมายถึงอะไรกันแน่ในการเปลี่ยนเส้นทางเอาต์พุต


19

ฉันเห็นสิ่งต่าง ๆ เช่นcommand 1> outหรือ2>&1เพื่อเปลี่ยนเส้นทาง stderr แต่บางครั้งฉันก็เห็น&>ตัวเอง ฯลฯ

วิธีที่ดีที่สุดที่จะเข้าใจ&คืออะไรและมันหมายถึงอะไรกันแน่?

คำตอบ:


26

&ใน2>&1แค่บอกว่าตัวเลข1เป็นอธิบายไฟล์และไม่ได้ชื่อไฟล์ ในกรณีstandard output file descriptorนี้

ถ้าคุณใช้2>1แล้วนี้จะเปลี่ยนเส้นทางไปยังแฟ้มข้อผิดพลาดที่เรียกว่า1แต่ถ้าคุณใช้แล้วมันจะส่งไปยัง2>&1standard output stream

นี่&>บอกว่าส่งทั้งสองstandard outputและstandard errorที่ไหนสักแห่ง ls <non-existent_file> &> out.fileยกตัวอย่างเช่น ขอยกตัวอย่างนี้ด้วยตัวอย่าง

ติดตั้ง:

  1. สร้างไฟล์ที่kokoมีเนื้อหาดังต่อไปนี้:

    #!bin/bash
    
    ls j1
    echo "koko2"
    
  2. ทำให้ปฏิบัติการ: chmod u+x koko

  3. ตอนนี้ทราบว่าj1ไม่มี

  4. ตอนนี้ทำงาน ./koko &> output

  5. วิ่งcat outputและคุณจะเห็น

    ls: cannot access 'j1': No such file or directory
    koko2
    

ทั้งสองstandard error( ls: cannot access 'j1': No such file or directory) และstandard output( koko2) outputถูกส่งไปยังแฟ้ม

ตอนนี้เรียกใช้อีกครั้ง แต่คราวนี้เป็นเช่นนั้น:

./koko > output

ทำcat outputและคุณจะเห็นkoko2เช่นเดียวกับ แต่ไม่ใช่เอาต์พุตข้อผิดพลาดจากls j1คำสั่ง ที่จะถูกส่งไปยังสิ่งstandard errorที่คุณจะเห็นในสถานีของคุณ

หมายเหตุสำคัญขอบคุณ @Byte Commander:

โปรดทราบว่าในcommand >file 2>&1ลำดับการเปลี่ยนเส้นทางมีความสำคัญ หากคุณเขียนcommand 2>&1 >fileแทน (ซึ่งโดยปกติจะไม่ใช่สิ่งที่คุณต้องการ) มันจะเปลี่ยนเส้นทางคำสั่งstdoutไปยังไฟล์ก่อนและหลังจากนั้นจะเปลี่ยนเส้นทางคำสั่งstderrไปยังคำสั่งที่ไม่ได้ใช้ในตอนนี้stdoutดังนั้นมันจะปรากฏขึ้นในเทอร์มินัล อีกครั้ง แต่จะไม่ถูกเขียนลงไฟล์


2
อะไรคือสิ่งที่&>หมายถึง?
AJJ

1
โปรดทราบว่าในcommand >file 2>&1ลำดับการเปลี่ยนเส้นทางมีความสำคัญ หากคุณเขียนcommand 2>&1 >fileแทน (ซึ่งโดยปกติจะไม่ใช่สิ่งที่คุณต้องการ) มันจะเปลี่ยนเส้นทางของคำสั่ง stdout ไปที่ไฟล์ก่อนและหลังจากนั้นเปลี่ยนเส้นทางของคำสั่ง stderr ไปยัง stdout ที่ไม่ได้ใช้ในขณะนี้ดังนั้นมันจะแสดงขึ้นในเทอร์มินัล หรือเปลี่ยนมันอีกครั้ง แต่มันจะไม่ถูกเขียนลงไฟล์
ผู้บัญชาการไบต์

2
"นั่นจะถูกส่งไปยังสิ่งstandard outputที่คุณจะเห็นในสถานีของคุณ" สิ่งนี้ไม่ควร "เป็นstandard error" หรือไม่
frarugi87

1
ใช่ @ frarugi87 การแก้ไขของคุณถูกต้อง
George Udosen

1
@ George ว้าวคุณเร็วมาก) ทำงานได้ดี
frarugi87

5

2
IIRC &> FILEนั้นจำเพาะกับ Bash เท่านั้นในขณะที่>FILE 2>&1กระสุนจำนวนมากเข้าใจ
ผู้บัญชาการ Byte

@ ByteCommander โอ้โหฉันไม่รู้ด้วยซ้ำว่า bash มีชวเลขอย่างนี้ ... ฉันใช้ 2> & 1 เสมอ
psusi

1

สิ่ง[n]>&wordนี้เรียกว่าDuplicating Output File Descriptor (ดูหัวข้อ 2.7.6ของ POSIX Shell Language Standard) ลักษณะการทำงานนี้โดยเฉพาะอย่างยิ่งเป็นคุณลักษณะของบอร์นเหมือนเปลือกหอยรวมทั้งksh, dashและbash; kshในความเป็นจริงมาตรฐานเป็นไปตามรอบเปลือกบอร์นและ เมื่อมองไปที่คู่มือtcshและcshดูเหมือนว่าพวกเขาไม่ได้ให้ความสามารถในการทำซ้ำ descriptor ไฟล์ใด ๆ อย่างไรก็ตามจากคำอธิบายของ>&สิ่งนี้จะทำงานเหมือน&>ในbash(นั่นคือเปลี่ยนเส้นทางข้อผิดพลาดและเอาท์พุทปกติไปยังไฟล์)

ในระวัง * เช่นระบบรวมทั้ง Ubuntu คุณมักจะได้ยินว่าไฟล์ทุกอย่างเป็นหรือค่อนข้างอธิบายไฟล์ เอาต์พุตมาตรฐานคือ file descriptor 1 และข้อผิดพลาดมาตรฐานคือ file descriptor 2 ดังนั้นใน> FILE 2>&1ทางเทคนิคแล้วหมายถึงไฟล์ descriptor 2 ที่ซ้ำกันไปยัง file descriptor 1 ในคำอื่น ๆ ของคำตอบนี้ :

2> & 1 บอกให้เชลล์ให้คำสั่งเป็น file descriptor 2 ซึ่งซ้ำกับ descriptor 1 (เช่น stderr & stdout point ให้ fd เดียวกัน)

กุญแจสำคัญในที่นี้คือการสังเกตว่า descriptor 1 ต้องถูกตั้งค่าก่อน เพราะการเปลี่ยนเส้นทางกระบวนการเปลือกในจากซ้ายไปขวาเพื่อที่command >FILE 2>&1จะบอกเปลือก ReWire stdout สำหรับcommandที่จะไปเป็นFILEครั้งแรกและเพียงแล้วบ่ง 2 จะกลายเป็นสำเนา 1 ที่เป็นที่ 1 และ 2 จุดไปยังตำแหน่งเดิม FILE-

หลักสูตรนี้นอกเหนือไปจากข้อผิดพลาดมาตรฐานและเอาต์พุตมาตรฐาน ดังที่แสดงในคำตอบนี้โดยการทำ3&>2

... คุณทำซ้ำ (dup2) ยื่น esritor 2 ไปยัง filescriptor 3, อาจจะปิด filescriptor 3 ถ้ามันเปิดอยู่แล้ว

ตัวอย่างของการจัดการไฟล์ descriptors ซึ่งในจำนวนมากจะจับเอาท์พุทของdialogคำสั่งลงในตัวแปร

นอกจากนี้ยังเป็นที่น่าสังเกตว่าเป็นเฉพาะกับ&> bashในzshสิ่งนี้จะทำงานเหมือนกัน แต่ตามเอกสารประกอบ "... ไม่มีผลเหมือนกับ '> คำ 2> & 1' ต่อหน้า multios" ใน POSIX ที่สอดคล้องกับ/bin/shสิ่งนี้จะถือว่าเป็นการเปลี่ยนเส้นทางปกติด้วยการวางคำสั่งลงในพื้นหลัง ดูเพิ่มเติม, มีรหัส sh ที่ไม่ถูกต้องตามหลักไวยากรณ์ bash code หรือไม่ .

ดูสิ่งนี้ด้วย:

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