ฉันเห็นบรรทัดนี้ในสคริปต์:
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 และในทางกลับกัน
มันแลกเปลี่ยนและstdout
stderr
>name
name
หมายถึงการเปลี่ยนเส้นทางออกไปยังแฟ้ม
>&number
number
หมายถึงการเปลี่ยนเส้นทางการส่งออกไปยังไฟล์อธิบาย
ดังนั้น&
จำเป็นต้องบอกเชลล์ว่าคุณหมายถึง 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