คำถามติดแท็ก file-descriptors

2
อะไรคือความแตกต่างระหว่าง & 6 กับ / dev / fd / 6?
หากต้องการอ่านจาก file descriptor 6 ฉันสามารถใช้<&6หรือ</dev/fd/6(aka /proc/self/fd/6) โดยปกติแล้วทั้งสองทำงานได้ดีเท่า ๆ กัน อย่างไรก็ตามหากไฟล์ descriptor นั้นเป็นซ็อกเก็ตสิ่งแปลก ๆ ก็เกิดขึ้น ตัวอย่างเช่น: $ bash -c 'ls -l /dev/fd/6;cat /dev/fd/6' 6</dev/tcp/localhost/12345 lrwx------ 1 michas michas 64 Jan 10 19:50 /dev/fd/6 -> socket:[315010] cat: /dev/fd/6: No such device or address ที่นี่lsแสดงให้เห็นถึง descriptor มีอยู่จริง แต่การเข้าถึงข้อมูลเป็นไปไม่ได้ด้วยวิธีนี้ ถ้าฉันใช้cat <&6แทนทุกอย่างทำงานได้ดีอีกครั้ง อะไรคือความแตกต่างระหว่างทั้งสองวิธีในการเข้าถึงไฟล์ descriptor? มีวิธีที่ดีในการเข้าถึง …

4
การเปลี่ยนเส้นทางเอาต์พุตโปรแกรม
เมื่อพยายามเปลี่ยนเส้นทางผลลัพธ์ของโปรแกรมโดยใช้ "ตัวเลขบางส่วนที่มากกว่า" ไวยากรณ์ (เช่นfoo 2> myfile) ตัวเลขที่เป็นไปได้ที่นี่คืออะไรและเป็นตัวแทนของอะไร ผมเชื่อว่า 1 /dev/stdout, /dev/stderr2 แล้ว 5 และ 6 ล่ะ มี 3, 4 หรือจำนวนมากกว่า 6?

2
stderr มากกว่า ssh -t
สิ่งนี้จะส่งเอาต์พุตไปยัง STDERR แต่ไม่แพร่กระจายCtrl+ C(เช่นCtrl+ Cจะฆ่าsshแต่ไม่ใช่รีโมตsleep): $ ssh localhost 'sleep 100;echo foo ">&2"' สิ่งนี้แพร่กระจายCtrl+ C(เช่นCtrl+ Cจะฆ่าsshและห่างไกลsleep) แต่ส่ง STDERR ไปยัง STDOUT: $ ssh -tt localhost 'sleep 100;echo foo ">&2"' ฉันจะบังคับให้วินาทีส่งเอาต์พุต STDERR ไปยัง STDERR ในขณะที่ยังคงแพร่กระจายCtrl+ ได้Cอย่างไร พื้นหลัง GNU ใช้ขนาน 'SSH -tt' เพื่อเผยแพร่+Ctrl Cสิ่งนี้ทำให้สามารถฆ่างานที่กำลังรันอยู่ในระยะไกลได้ แต่ข้อมูลที่ส่งไปยัง STDERR ควรไปยัง STDERR ต่อไปเมื่อสิ้นสุดการรับ

2
ใบสั่งเอาท์พุทที่มีการทดแทนกระบวนการ
นี่คือสิ่งที่ฉันมักจะทำเพื่อเรียกใช้grepและwcบนไฟล์โดยไม่ต้องสแกนสองครั้ง <file.txt tee >(grep LITERAL) >(wc -l) >/dev/null อย่างไรก็ตามอัตราผลตอบแทนนี้ EXEC LITERAL 32 บางครั้งและ 32 EXEC LITERAL ในเวลาอื่น ๆ (เอาต์พุตจากgrepนำหน้าเอาต์พุตจากwcในอินสแตนซ์แรกและกลับกันในวินาที) ในขณะที่มีการเปลี่ยนเส้นทางและอธิบายไฟล์ { { <file.txt tee /dev/fd/3 | grep LITERAL >&4; } 3>&1 | wc -l ;} 4>&1 ฉันมักจะได้รับเสมอ EXEC LITERAL 32 ฉันชอบที่คำสั่งเอาท์พุทสามารถคาดเดาได้ แต่รับประกันด้วยแนวทางที่สองหรือไม่?

2
ทำไมการทดแทนกระบวนการ <() ไม่ทำงานกับ ssh -F
ฉันมีบางเครื่องเสมือนจรจัด เพื่อเข้าสู่พวกเขาฉันออกvagrant sshคำสั่ง ฉันต้องการเข้าสู่ระบบโดยใช้sshคำสั่งปกติ vagrant ssh-configออกผลลัพธ์เป็นไฟล์ config ที่เหมาะสม $ vagrant ssh-config Host default HostName 127.0.0.1 User vagrant Port 2201 UserKnownHostsFile /dev/null StrictHostKeyChecking no PasswordAuthentication no IdentityFile /home/cbliard/.vagrant.d/insecure_private_key IdentitiesOnly yes LogLevel FATAL เมื่อส่งออกการกำหนดค่านี้ในไฟล์และใช้กับssh -Fทุกอย่างทำงานได้ดี: $ vagrant ssh-config &gt; /tmp/config $ ssh -F /tmp/config default =&gt; logged successfully เมื่อใช้ตัวดำเนินการทดแทนกระบวนการ&lt;(cmd)เพื่อป้องกันการสร้างไฟล์กำหนดค่าชั่วคราวมันจะล้มเหลว: $ ssh -F …

4
โฟลเดอร์ชั่วคราวที่ทำลายโดยอัตโนมัติหลังจากกระบวนการออก
เราสามารถใช้โฟลเดอร์ชั่วคราวเช่นไฟล์ชั่วคราว TMP=$(mktemp ... ) exec 3&lt;&gt;$TMP rm $TMP cat &lt;&amp;3 ซึ่งจะถูกทำลายโดยอัตโนมัติหลังจากที่เปลือกนี้จบการทำงาน

3
ไพพ์เนม, ตัวอธิบายไฟล์และ EOF
สองหน้าต่างผู้ใช้เดียวกันพร้อมกับ bash พร้อมต์ ในประเภท window-1: $ mkfifo f; exec &lt;f ดังนั้นทุบตีอยู่ในขณะนี้พยายามอ่านจากไฟล์อธิบาย 0 fซึ่งถูกแมปไปไปป์ที่มีชื่อ ในประเภท window-2: $ echo ls &gt; f ตอนนี้ window-1 จะพิมพ์ ls แล้วเชลล์ก็จะตาย ทำไม? ทดลองถัดไป: เปิดหน้าต่าง-1 exec &lt;fอีกครั้งกับ ในประเภท window-2: $ exec 3&gt;f $ echo ls &gt;&amp;3 หลังจากบรรทัดแรกด้านบน window-1 จะปลุกและพิมพ์พรอมต์ ทำไม? หลังจากบรรทัดที่สองข้างต้น window-1 จะพิมพ์lsเอาต์พุตและเชลล์ยังมีชีวิตอยู่ ทำไม? อันที่จริงตอนนี้ใน window-2 echo …

1
OS X, bash: ใช้งานได้กับตัวอธิบายไฟล์ที่เปิดน้อยกว่า cat ไม่ทำงาน
ในสคริปต์ทุบตีที่ฉันกำลังทำงาน (ซึ่งต้องทำงานบน Ubuntu และ OS X) ฉันต้องเปลี่ยนเส้นทางเอาต์พุตของคำสั่งหลายร้อยไปยังไฟล์ แทนที่จะเพิ่ม&amp;&gt;...พวกเขาทั้งหมดต่อท้ายฉันก็ทำได้ exec 9&gt;&amp;1 exec 5&lt;&gt;/tmp/some-file.txt exec 1&gt;&amp;5 จนถึงตอนนี้ดีมาก แต่ครึ่งหนึ่งของคำสั่งเหล่านั้นฉันต้องอ่านทุกอย่างที่เขียนไปแล้วในขณะที่เปิดไฟล์ descriptor ไว้ ตอนนี้บน Ubuntu ฉันสามารถทำได้ cat /dev/fd/5 หรือ tee &lt;/dev/fd/5 แต่ใน OS X ไม่มีอะไรถูกพิมพ์เลย (และคำสั่งจะออกทันที) อย่างไรก็ตามการใช้lessฉันสามารถดูเนื้อหาของไฟล์ทั้งสอง ฉันสามารถบรรลุผลข้างต้น (ทำงานกับทั้งสองระบบปฏิบัติการ) โดยใช้ less /dev/fd/5 | tee แต่ดูเหมือนว่าแฮ็ค ดังนั้นเหตุใดจึงlessเห็นสิ่งที่catไม่สามารถใช้กับ OS X ได้ (หรือลูกหลาน BSD ทุกคนได้รับผลกระทบหรือไม่) หรือฉันกำลังทำอะไรผิดพลาด?

4
ทำไมฉันถึงไม่สามารถ 'tail -f / proc / $ pid / fd / 1` ได้?
ฉันเขียนสคริปต์ง่ายๆซึ่งechoเป็น PID: #/bin/bash while true; do echo $$; sleep 0.5; done ฉันกำลังเรียกใช้สคริปต์ดังกล่าว (มันบอก3844ซ้ำแล้วซ้ำอีก) ใน terminal หนึ่งและพยายามที่จะtailอธิบายไฟล์ในอีกหนึ่ง: $ tail -f /proc/3844/fd/1 ^cมันไม่ได้พิมพ์อะไรไปที่หน้าจอและแฮงค์จน ทำไม? นอกจากนี้ลิงก์ตัวอธิบายไฟล์ STD ทั้งหมด (IN / OUT / ERR) ไปยัง pts เดียวกัน: $ ls -l /proc/3844/fd/ total 0 lrwx------ 1 mg mg 64 sie 29 13:42 0 -&gt; /dev/pts/14 …

2
ดำเนินการคำสั่งในเทอร์มินัลที่ใช้งานระยะไกล
สมมติว่าคุณมีเทอร์มินัลอีมูเลเตอร์ (T1) เปิดด้วย PID 6350 จากเทอร์มินัลอื่นให้พิมพ์คำสั่งนี้ (C1): echo "ls\n" &gt; /proc/6350/fd/0 สิ่งนี้เขียนlsและขึ้นบรรทัดใหม่ใน T1 แต่ไม่ได้ดำเนินการ ทำไม? ฉันพยายามใช้cat|bashด้วยecho "ls\n" &gt; /proc/catid/fd/0แต่ก็ยังไม่ได้ดำเนินการ ฉันจะสะท้อนคำสั่งไปยังเทอร์มินัลอื่นและสั่งการได้อย่างไร? คำตอบที่เป็นไปได้: $ mkfifo toto; $ bash &lt; toto; $ echo "ls" &gt; toto; ในกรณีนี้คุณไม่สามารถเขียนได้อีกต่อไปในเทอร์มินัลโดยตรง (ทุกอย่างจะแสดงในลักษณะเดียวกับที่แสดงคำสั่ง (C1) ในเทอร์มินัลนี้

3
เขียนถึง stdin ของกระบวนการ
เท่าที่ฉันเข้าใจถ้าฉันพิมพ์ต่อไปนี้ ... python -i ... python-interpreter จะอ่านจาก stdin, ประพฤติ (ชัด) เช่นนี้: &gt;&gt;&gt; print "Hello" Hello ฉันคาดหวังว่ามันจะทำสิ่งเดียวกันถ้าฉันทำสิ่งนี้: echo 'print "Hello"' &gt; /proc/$(pidof python)/fd/0 แต่นี่คือผลลัพธ์ (beeing บรรทัดว่างจริง): &gt;&gt;&gt; print "Hello" &lt;empyline&gt; สิ่งนี้สำหรับฉันดูเหมือนว่าเพิ่งใช้print "Hello"\nและเขียนถึง stdoutแต่ไม่ได้ตีความ ทำไมมันไม่ทำงานและฉันต้องทำอย่างไรเพื่อให้มันทำงาน?

2
วิธีอ่านอินพุตของผู้ใช้เมื่อใช้สคริปต์ในไพพ์
ปัญหาทั่วไป ฉันต้องการเขียนสคริปต์ที่โต้ตอบกับผู้ใช้แม้ว่ามันจะอยู่กลางสายโซ่ของท่อ ตัวอย่างคอนกรีต รูปธรรมก็จะใช้เวลาfileหรือstdinแสดงเส้น (มีหมายเลขบรรทัด) stdoutขอให้ผู้ใช้ป้อนข้อมูลการเลือกหรือสายตัวเลขและจากนั้นพิมพ์เส้นที่สอดคล้องกับ มาเรียกสคริปต์นี้selectorกัน ถ้าอย่างนั้นฉันก็อยากจะทำ grep abc foo | selector &gt; myfile.tmp ถ้าfooมี blabcbla foo abc bar quux xyzzy abc จากนั้นselectorนำเสนอตัวเลือก (บนเทอร์มินัลไม่ใช่ในmyfile.tmp!) 1) blabcbla 2) foo abc bar 3) xyzzy abc Select options: หลังจากนั้นฉันพิมพ์ 2-3 และจบลงด้วย foo abc bar xyzzy abc myfile.tmpเป็นเนื้อหาของ ฉันมีสคริปต์ตัวเลือกทำงานอยู่และโดยพื้นฐานแล้วมันจะทำงานได้อย่างสมบูรณ์แบบหากฉันไม่เปลี่ยนเส้นทางอินพุตและเอาต์พุต ดังนั้น selector foo ทำงานเหมือนที่ฉันต้องการ …

1
นิรุกติศาสตร์ของ "descriptor" ใน "file descriptor"
การเลือกคำอธิบายให้ฉันเป็นคี่เสมอ "ดัชนี" หรือ "id" ดูเหมือนเป็นทางเลือกที่ชัดเจนกว่า มีเหตุผลที่รู้จักกันดีสำหรับการเลือกคำว่า "descriptor" หรือไม่? ฉันเดาว่า "ผู้ให้คำอธิบาย" เข้าใจว่าบ่อยครั้งที่มันเป็นแนวคิดที่สำคัญกว่า ish มากกว่า number-ish แต่บางครั้งมันก็เป็นตัวเลขที่มากจริงๆ
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.