ฉันเห็นสิ่งต่าง ๆ เช่นcommand 1> out
หรือ2>&1
เพื่อเปลี่ยนเส้นทาง stderr แต่บางครั้งฉันก็เห็น&>
ตัวเอง ฯลฯ
วิธีที่ดีที่สุดที่จะเข้าใจ&
คืออะไรและมันหมายถึงอะไรกันแน่?
ฉันเห็นสิ่งต่าง ๆ เช่นcommand 1> out
หรือ2>&1
เพื่อเปลี่ยนเส้นทาง stderr แต่บางครั้งฉันก็เห็น&>
ตัวเอง ฯลฯ
วิธีที่ดีที่สุดที่จะเข้าใจ&
คืออะไรและมันหมายถึงอะไรกันแน่?
คำตอบ:
&
ใน2>&1
แค่บอกว่าตัวเลข1
เป็นอธิบายไฟล์และไม่ได้ชื่อไฟล์ ในกรณีstandard output file descriptor
นี้
ถ้าคุณใช้2>1
แล้วนี้จะเปลี่ยนเส้นทางไปยังแฟ้มข้อผิดพลาดที่เรียกว่า1
แต่ถ้าคุณใช้แล้วมันจะส่งไปยัง2>&1
standard output stream
นี่&>
บอกว่าส่งทั้งสองstandard output
และstandard error
ที่ไหนสักแห่ง ls <non-existent_file> &> out.file
ยกตัวอย่างเช่น ขอยกตัวอย่างนี้ด้วยตัวอย่าง
ติดตั้ง:
สร้างไฟล์ที่koko
มีเนื้อหาดังต่อไปนี้:
#!bin/bash
ls j1
echo "koko2"
ทำให้ปฏิบัติการ: chmod u+x koko
ตอนนี้ทราบว่าj1
ไม่มี
ตอนนี้ทำงาน ./koko &> output
วิ่ง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
ดังนั้นมันจะปรากฏขึ้นในเทอร์มินัล อีกครั้ง แต่จะไม่ถูกเขียนลงไฟล์
command >file 2>&1
ลำดับการเปลี่ยนเส้นทางมีความสำคัญ หากคุณเขียนcommand 2>&1 >file
แทน (ซึ่งโดยปกติจะไม่ใช่สิ่งที่คุณต้องการ) มันจะเปลี่ยนเส้นทางของคำสั่ง stdout ไปที่ไฟล์ก่อนและหลังจากนั้นเปลี่ยนเส้นทางของคำสั่ง stderr ไปยัง stdout ที่ไม่ได้ใช้ในขณะนี้ดังนั้นมันจะแสดงขึ้นในเทอร์มินัล หรือเปลี่ยนมันอีกครั้ง แต่มันจะไม่ถูกเขียนลงไฟล์
standard output
ที่คุณจะเห็นในสถานีของคุณ" สิ่งนี้ไม่ควร "เป็นstandard error
" หรือไม่
> FILE 2>&1
และ&> FILE
เทียบเท่า ดู8.2.3.2 การเปลี่ยนเส้นทางข้อผิดพลาดในคู่มือ Bash สำหรับผู้เริ่มต้นบทที่ 8
&> FILE
นั้นจำเพาะกับ Bash เท่านั้นในขณะที่>FILE 2>&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 หรือไม่ .
ดูสิ่งนี้ด้วย:
&>
หมายถึง?