“ 3> & 1 1> & 2 2> & 3” ทำอะไรในสคริปต์


69

ฉันเห็นบรรทัดนี้ในสคริปต์:

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และ&สำหรับ


คำตอบ:


77

ตัวเลขเป็นตัวอธิบายไฟล์และมีเพียงสามตัวแรก (เริ่มต้นด้วยศูนย์) เท่านั้นที่มีความหมายมาตรฐาน:

0 - stdin
1 - stdout
2 - stderr

ดังนั้นตัวเลขเหล่านี้ในคำสั่งของคุณอ้างอิงถึงไฟล์ descriptor คุณสามารถเปลี่ยนเส้นทางอธิบายไฟล์ไปยังไฟล์ด้วย>หรือเปลี่ยนเส้นทางไปที่อธิบายไฟล์อื่นด้วย>&

3>&1ในบรรทัดคำสั่งของคุณจะสร้างบ่งแฟ้มใหม่และเปลี่ยนเส้นทางไปยังซึ่งเป็น1 STDOUTตอนนี้1>&2จะเปลี่ยนเส้นทางไฟล์อธิบาย 1 ถึงSTDERRและ2>&3จะเปลี่ยนเส้นทางไฟล์อธิบาย 2-3 STDOUTซึ่งเป็น

ดังนั้นโดยทั่วไปคุณเปลี่ยนSTDOUTและSTDERRเหล่านี้เป็นขั้นตอนที่:

  1. สร้าง fd 3 ใหม่แล้วชี้ไปที่ fd 1
  2. Redirect file descriptor 1 ไปยัง file descriptor 2 หากเราไม่บันทึกไฟล์ descriptor ใน 3 เราจะเสียเป้าหมาย
  3. Redirect file descriptor 2 ถึง file descriptor 3 ตอนนี้ file descriptor หนึ่งและสองจะถูกสลับ

ตอนนี้ถ้าโปรแกรมพิมพ์บางอย่างไปยัง file descriptor 1 มันจะถูกพิมพ์ไปที่ file descriptor 2 และในทางกลับกัน


คุณได้กล่าวว่า "3> & 1 ในบรรทัดคำสั่งของคุณจะสร้างไฟล์ descriptor ใหม่และเปลี่ยนเส้นทางไปที่ 1 ซึ่งก็คือ STDOUT" แต่ไม่ได้หมายความว่า 1 STDIN?
sofs1

19

มันแลกเปลี่ยนและ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ด้วยเหตุผลบางประการ

ดูคำสั่งของการเปลี่ยนเส้นทาง


1

ผู้เขียนสคริปต์กำหนด 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


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