ฉันเห็นบรรทัดนี้ในสคริปต์:
DEVICE=`dialog --inputbox "Festplatten-Laufzeit auslesen. Gebe Sie das
gewünschte Device an: " 0 70 "" 3>&1 1>&2 2>&3`
คืออะไร
3>&1 1>&2 2>&3
ทำ? ฉันรู้ว่า 1 = stdout และ 2 = stderr แต่อะไร3และ&สำหรับ
ฉันเห็นบรรทัดนี้ในสคริปต์:
DEVICE=`dialog --inputbox "Festplatten-Laufzeit auslesen. Gebe Sie das
gewünschte Device an: " 0 70 "" 3>&1 1>&2 2>&3`
คืออะไร
3>&1 1>&2 2>&3
ทำ? ฉันรู้ว่า 1 = stdout และ 2 = stderr แต่อะไร3และ&สำหรับ
คำตอบ:
ตัวเลขเป็นตัวอธิบายไฟล์และมีเพียงสามตัวแรก (เริ่มต้นด้วยศูนย์) เท่านั้นที่มีความหมายมาตรฐาน:
0 - stdin
1 - stdout
2 - stderr
ดังนั้นตัวเลขเหล่านี้ในคำสั่งของคุณอ้างอิงถึงไฟล์ descriptor คุณสามารถเปลี่ยนเส้นทางอธิบายไฟล์ไปยังไฟล์ด้วย>หรือเปลี่ยนเส้นทางไปที่อธิบายไฟล์อื่นด้วย>&
3>&1ในบรรทัดคำสั่งของคุณจะสร้างบ่งแฟ้มใหม่และเปลี่ยนเส้นทางไปยังซึ่งเป็น1 STDOUTตอนนี้1>&2จะเปลี่ยนเส้นทางไฟล์อธิบาย 1 ถึงSTDERRและ2>&3จะเปลี่ยนเส้นทางไฟล์อธิบาย 2-3 STDOUTซึ่งเป็น
ดังนั้นโดยทั่วไปคุณเปลี่ยนSTDOUTและSTDERRเหล่านี้เป็นขั้นตอนที่:
ตอนนี้ถ้าโปรแกรมพิมพ์บางอย่างไปยัง file descriptor 1 มันจะถูกพิมพ์ไปที่ file descriptor 2 และในทางกลับกัน
มันแลกเปลี่ยนและstdoutstderr
>namenameหมายถึงการเปลี่ยนเส้นทางออกไปยังแฟ้ม
>&numbernumberหมายถึงการเปลี่ยนเส้นทางการส่งออกไปยังไฟล์อธิบาย
ดังนั้น&จำเป็นต้องบอกเชลล์ว่าคุณหมายถึง file descriptor ไม่ใช่ชื่อไฟล์
file descriptor เป็นตัวเลขที่อ้างถึงไฟล์ที่เปิดอยู่แล้ว รายการมาตรฐาน0สำหรับอินพุต1มาตรฐานสำหรับเอาต์พุตมาตรฐานหรือ2ข้อผิดพลาดมาตรฐาน นอกจากนี้คุณยังสามารถใช้หมายเลขอื่น ๆ var=valueซึ่งจะสร้างบ่งแฟ้มใหม่เช่นเดียวกับเมื่อคุณสร้างตัวแปรใหม่ที่มี
โดยค่าเริ่มต้นทั้งไฟล์บ่งชี้1และ2ไปที่/dev/ttyดังนั้นหากคุณเรียกใช้somecommand 3>&1 1>&2 2>&3ในเชลล์ใหม่มันจะไม่เปลี่ยนแปลงอะไรเลย (ยกเว้นตอนนี้คุณมีไฟล์อธิบายไฟล์หมายเลข 3)
แต่ถ้าอยู่ที่ไหนสักแห่งก่อนหน้าในสคริปต์มันจะเปลี่ยนเส้นทางโดยใช้ exec (เช่นexec 2>error.log) หรือสคริปต์จะทำงานด้วยบรรทัดคำสั่งรวมถึงการเปลี่ยนเส้นทาง (เช่น./thescript 2>error.log) จากนั้นการแลกเปลี่ยน stdout และ stderr จะทำอะไรบางอย่าง
ในกรณีของคุณโดยเฉพาะคำสั่งที่มี stdout และ stderr dialogเปลี่ยนเป็น ฉันเห็นหน้าคนของมัน
Some widgets, e.g., checklist, will write text to dialog's output.
Normally that is the standard error
ดังนั้นคนที่เขียนสคริปต์อาจต้องการให้dialogเอาท์พุตstdoutแทนที่จะไปstderrด้วยเหตุผลบางประการ
ผู้เขียนสคริปต์กำหนด fd 3 เช่น:
exec 3<> File.txt
เปิด "File.txt" และกำหนด fd 3 ให้กับมัน ตัวอธิบายไฟล์สูงสุด: 255
read -n 4 <&3
อ่านได้เพียง 4 ตัวอักษร
echo -n . >&3
เขียนจุดทศนิยมที่นั่น
exec 3>&-
ปิด fd 3
cat File.txt
==> 1234.67890