ฉันเห็นสิ่งต่าง ๆ เช่นcommand 1> outหรือ2>&1เพื่อเปลี่ยนเส้นทาง stderr แต่บางครั้งฉันก็เห็น&>ตัวเอง ฯลฯ
วิธีที่ดีที่สุดที่จะเข้าใจ&คืออะไรและมันหมายถึงอะไรกันแน่?
ฉันเห็นสิ่งต่าง ๆ เช่นcommand 1> outหรือ2>&1เพื่อเปลี่ยนเส้นทาง stderr แต่บางครั้งฉันก็เห็น&>ตัวเอง ฯลฯ
วิธีที่ดีที่สุดที่จะเข้าใจ&คืออะไรและมันหมายถึงอะไรกันแน่?
คำตอบ:
&ใน2>&1แค่บอกว่าตัวเลข1เป็นอธิบายไฟล์และไม่ได้ชื่อไฟล์ ในกรณีstandard output file descriptorนี้
ถ้าคุณใช้2>1แล้วนี้จะเปลี่ยนเส้นทางไปยังแฟ้มข้อผิดพลาดที่เรียกว่า1แต่ถ้าคุณใช้แล้วมันจะส่งไปยัง2>&1standard 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 หรือไม่ .
ดูสิ่งนี้ด้วย:
&>หมายถึง?