คำถามติดแท็ก pipe

ไปป์ Unix เชื่อมต่อตัวอธิบายไฟล์ของสองกระบวนการ ไปป์ถูกสร้างขึ้นด้วยฟังก์ชัน POSIX pipe () ที่ประกาศใน <unistd.h> เชลล์จัดเตรียมการสร้างไพพ์ระหว่างกระบวนการโดยใช้ "|"

3
วิธีดาวน์โหลดไฟล์เก็บถาวรและแตกไฟล์โดยไม่บันทึกไฟล์ลงดิสก์
ฉันต้องการดาวน์โหลดและแยกไฟล์เก็บถาวรภายใต้ไดเรกทอรีที่กำหนด นี่คือวิธีที่ฉันทำไปแล้ว: wget http://downloads.mysql.com/source/dbt2-0.37.50.3.tar.gz tar zxf dbt2-0.37.50.3.tar.gz mv dbt2-0.37.50.3 dbt2 ฉันต้องการดาวน์โหลดและแตกไฟล์เก็บถาวรทันทีโดยไม่ต้องtar.gzเขียนลงดิสก์ ฉันคิดว่าสิ่งนี้เป็นไปได้โดยการส่งออกwgetไปยังtarและให้tarเป้าหมาย แต่ในทางปฏิบัติฉันไม่ทราบวิธีการรวมชิ้นส่วนเข้าด้วยกัน
62 shell  pipe  tar  wget 

4
ข้อดีของการใช้ไปป์ที่มีชื่อบนไพพ์ที่ไม่มีชื่อคืออะไร
ฉันทบทวนคำถามสัมภาษณ์ที่ถามจากผู้ดูแลระบบยูนิกซ์; ฉันพบหัวข้อที่ชื่อว่า "named pipe" ฉันไปที่หัวข้อ เท่าที่ฉันสามารถเข้าใจได้: - ชื่อท่อ | | FIFO แต่ถึงกระนั้นฉันก็รู้สึกว่าฉันขาดความรู้ว่าจะใช้ท่อชนิดนี้เมื่อใด มีสถานการณ์พิเศษใด ๆ ที่ท่อที่ไม่มีชื่อจะไม่ทำงานหรือไม่
51 pipe 

5
คำสั่ง mknod ใช้ทำอะไร?
ฉันเพิ่งเริ่มใช้ Ubuntu เป็นระบบปฏิบัติการหลักของฉันและฉันต้องการเรียนรู้เกี่ยวกับสิ่งที่ฉันไม่ควรทำและเรียนรู้จากสิ่งเลวร้ายที่ผู้คนเคยทำในอดีต ฉันเจออีเมลเหล่านี้เกี่ยวกับเรื่องราวสยองขวัญที่ผู้ดูแลระบบ UNIX และ Linuxได้ทำในระบบของตนเองเมื่อพวกเขาอยู่ที่ใหม่ หลายคนที่เกี่ยวข้องกับการใช้คำสั่ง mknod เพื่อ distory และแก้ไขปัญหา ฉันไม่เคยได้ยินเกี่ยวกับคำสั่งนี้มาก่อนและหน้า man ภายใน Ubuntu ไม่ได้มีประโยชน์มาก ดังนั้นคำถามของฉันคือคำสั่งนี้ใช้อะไรและมีตัวอย่างอะไรบ้างที่เป็นประโยชน์ในการใช้งานในแต่ละวัน?

4
ฉันควรจะดูแลแมวที่ไม่จำเป็นหรือไม่?
ยูทิลิตีบรรทัดคำสั่งจำนวนมากสามารถรับอินพุตได้จากไพพ์หรือเป็นอาร์กิวเมนต์ชื่อไฟล์ สำหรับเชลล์สคริปต์แบบยาวฉันพบว่าการเริ่มต้นลูกโซ่ด้วย a catทำให้อ่านได้ง่ายขึ้นโดยเฉพาะถ้าคำสั่งแรกต้องการอาร์กิวเมนต์หลายบรรทัด เปรียบเทียบ sed s/bla/blaha/ data \ | grep blah \ | grep -n babla และ cat data \ | sed s/bla/blaha/ \ | grep blah \ | grep -n babla วิธีหลังมีประสิทธิภาพน้อยลงหรือไม่ ถ้าเป็นเช่นนั้นความแตกต่างมากพอที่จะใส่ใจว่าสคริปต์รันหรือไม่พูดเป็นวินาทีหรือไม่ ความแตกต่างในการอ่านไม่มาก

3
วิธีการใช้คำสั่ง watch กับสายโซ่ของคำสั่ง / โปรแกรม
ฉันมักจะใช้watchยูทิลิตี้ linux เพื่อดูผลลัพธ์ของคำสั่งซ้ำ ๆ ทุก ๆ n วินาทีเช่นในwatch df -h /some_volume/ แต่ฉันดูเหมือนจะไม่สามารถใช้watchกับชุดคำสั่ง piped เช่น: $ watch ls -ltr|tail -n 1 ถ้าฉันทำอย่างนั้นwatchจริง ๆ กำลังดูls -ltrและกำลังส่งผ่านไปtail -n 1ซึ่งไม่แสดงผลอะไร ถ้าฉันลองทำสิ่งนี้: $ watch (ls -ltr|tail -n 1) ฉันเข้าใจ $ watch: syntax error near unexpected token `ls' และข้อใดข้อหนึ่งต่อไปนี้ล้มเหลวด้วยเหตุผลบางประการ: $ watch &lt;(ls -ltr|tail -n 1) $ …
50 linux  bash  pipe  watch 

2
Bash: วิธีอ่านทีละหนึ่งบรรทัดจากเอาต์พุตของคำสั่ง?
while loopฉันพยายามที่จะอ่านผลลัพธ์ของคำสั่งในทุบตีใช้ที่ while read -r line do echo "$line" done &lt;&lt;&lt; $(find . -type f) ผลลัพธ์ที่ฉันได้รับ ranveer@ranveer:~/tmp$ bash test.sh ./test.py ./test1.py ./out1 ./test.sh ./out ./out2 ./hello ranveer@ranveer:~/tmp$ หลังจากนี้ฉันก็ลอง $(find . -type f) | while read -r line do echo "$line" done test.sh: line 5: ./test.py: Permission deniedแต่มันก็สร้างข้อผิดพลาด ดังนั้นฉันจะอ่านทีละบรรทัดได้อย่างไรเพราะฉันคิดว่าขณะนี้มันกำลังซัดทั้งบรรทัดในครั้งเดียว เอาต์พุตที่ต้องการ: ./test.py …
49 bash  shell  find  pipe 

10
จะตรวจสอบได้อย่างไรว่าไพพ์นั้นว่างเปล่าและเรียกใช้คำสั่งกับข้อมูลหากไม่มีหรือไม่
ฉันไพพ์บรรทัดในสคริปต์ทุบตีและต้องการตรวจสอบว่าไพพ์มีข้อมูลหรือไม่ก่อนป้อนเข้าโปรแกรม กำลังค้นหาฉันพบtest -t 0แต่มันใช้งานไม่ได้ที่นี่ ส่งคืนค่าเท็จเสมอ ดังนั้นจะแน่ใจได้อย่างไรว่าท่อมีข้อมูลหรือไม่ ตัวอย่าง: echo "string" | [ -t 0 ] &amp;&amp; echo "empty" || echo "fill" เอาท์พุท: fill echo "string" | tail -n+2 | [ -t 0 ] &amp;&amp; echo "empty" || echo "fill" เอาท์พุท: fill ซึ่งแตกต่างจากวิธีมาตรฐาน / มาตรฐานเพื่อทดสอบว่าก่อนหน้านี้ท่อที่ผลิตได้หรือไม่ อินพุตจะต้องเก็บรักษาไว้เพื่อส่งผ่านไปยังโปรแกรม นี่เป็นการสรุปวิธีการไพพ์เอาท์พุทจากโปรเซสหนึ่งไปยังอีกโปรเซสเท่านั้น ซึ่งมุ่งเน้นการส่งอีเมล
42 bash  shell  pipe 

2
ทำไมกระบวนการทดแทนจึงส่งผลให้ไฟล์ชื่อ / dev / fd / 63 ซึ่งเป็นไพพ์
ฉันพยายามเข้าใจไพพ์ที่มีชื่อในบริบทของตัวอย่างเฉพาะนี้ ฉันพิมพ์&lt;(ls -l)เทอร์มินัลแล้วรับเอาต์พุตเป็น, bash: /dev/fd/63: Permission denied. ถ้าฉันพิมพ์cat &lt;(ls -l)ฉันจะได้เห็นเนื้อหาไดเรกทอรี ถ้าฉันแทนที่catด้วยechoฉันคิดว่าฉันได้รับชื่อสถานี (หรือมันคืออะไร?) echo &lt;(ls -l)/dev/fd/63ให้ออกเป็น นอกจากนี้ผลลัพธ์ตัวอย่างนี้ไม่ชัดเจนสำหรับฉัน ls -l &lt;(echo "Whatever") lr-x------ 1 root root 64 Sep 17 13:18 /dev/fd/63 -&gt; pipe:[48078752] อย่างไรก็ตามถ้าฉันให้ls -l &lt;()มันจะแสดงเนื้อหาไดเรกทอรี เกิดอะไรขึ้นในกรณีของไปป์ที่ระบุชื่อ?

7
ไปป์ไลน์แบบมีเงื่อนไข
ว่าฉันมีท่อต่อไปนี้: cmd1 &lt; input.txt |\ cmd2 |\ cmd4 |\ cmd5 |\ cmd6 |\ (...) |\ cmdN &gt; result.txt ภายใต้เงื่อนไขบางผมอยากจะเพิ่มcmd3ระหว่างและcmd2 cmd4มีวิธีในการสร้างไปป์ไลน์แบบมีเงื่อนไขโดยไม่บันทึกผลลัพธ์ของ cmd2 ลงในไฟล์ชั่วคราวหรือไม่? ฉันจะคิดถึงสิ่งที่ชอบ: cmd1 &lt; input.txt |\ cmd2 |\ (${DEFINED}? cmd3 : cat ) |\ cmd4 |\ cmd5 |\ cmd6 |\ (...) |\ cmdN &gt; result.txt
39 pipe 

3
ไพพ์คำสั่งหลังจาก xargs ไพพ์
HP-UX ***** B.11.23 U ia64 **** ใบอนุญาตผู้ใช้ไม่ จำกัด find . -type d -name *log* | xargs ls -la ให้ฉันชื่อไดเรกทอรี (คนที่มีlogอยู่ในชื่อไดเรกทอรี) ตามด้วยไฟล์ทั้งหมดในไดเรกทอรีนั้น ไดเรกทอรี /var/opt/SID/application_a/log/, /var/opt/SID/application_b/log/, /var/opt/SID/application_c/log/และอื่น ๆ ประกอบด้วยไฟล์บันทึก ฉันต้องการเพียงสอง logfiles ล่าสุดที่จะแสดงตามคำสั่งซึ่งผมมักจะพบการใช้lsls -latr | tail -2 ผลลัพธ์จะต้องมีลักษณะเช่นนี้ .. /var/opt/SID/application_a/log/ -rw-rw-rw- 1 user1 user1 59698 Jun 11 2013 log1 -rw-rw-rw- 1 user1 user1 …
38 shell  find  pipe  xargs 

6
วิธีหลอกให้คำสั่งคิดว่าเอาต์พุตกำลังไปที่เทอร์มินัล
เมื่อได้รับคำสั่งที่เปลี่ยนพฤติกรรมเมื่อเอาต์พุตกำลังส่งไปยังเทอร์มินัล (เช่นสร้างเอาต์พุตสี) เอาต์พุตนั้นสามารถเปลี่ยนเส้นทางในไพพ์ไลน์ได้อย่างไรในขณะที่รักษาพฤติกรรมที่เปลี่ยนไป จะต้องมียูทิลิตี้สำหรับสิ่งที่ฉันไม่ทราบ คำสั่งบางคำสั่งเช่นgrep --color=alwaysมีแฟล็กตัวเลือกเพื่อบังคับให้ทำงาน แต่คำถามคือวิธีการแก้ไขโปรแกรมที่ต้องอาศัยการทดสอบ descriptor ไฟล์เอาต์พุตเพียงอย่างเดียว ถ้ามันเป็นเรื่องสำคัญเปลือกของฉันอยู่bashบน Linux
38 shell  pipe  utilities  stdout  pty 

3
ท่อส่ง จำกัด การใช้หน่วยความจำอย่างไร
Brian Kernighan อธิบายในวิดีโอนี้ถึงการดึงดูดเบลล์แล็บในช่วงต้นให้กับภาษา / โปรแกรมเล็ก ๆ เครื่องจักรขนาดใหญ่จะเป็น 64 k-bytes - K ไม่ใช่ M หรือ G - และนั่นหมายความว่าโปรแกรมแต่ละโปรแกรมไม่สามารถมีขนาดใหญ่มากดังนั้นจึงมีแนวโน้มที่จะเขียนโปรแกรมขนาดเล็กและกลไกของท่อ โดยทั่วไปการเปลี่ยนเส้นทางอินพุตเอาต์พุตทำให้สามารถเชื่อมโยงโปรแกรมหนึ่งไปยังอีกโปรแกรมหนึ่งได้ แต่ฉันไม่เข้าใจว่าวิธีนี้จะ จำกัด การใช้หน่วยความจำอย่างไรเนื่องจากต้องเก็บข้อมูลใน RAM เพื่อส่งระหว่างโปรแกรม จากวิกิพีเดีย : ในระบบที่เหมือนยูนิกซ์ส่วนใหญ่กระบวนการทั้งหมดของไปป์ไลน์จะเริ่มพร้อมกันมีการเชื่อมต่อกับสตรีมอย่างเหมาะสมและจัดการโดยตัวกำหนดตารางเวลาร่วมกับกระบวนการอื่น ๆ ทั้งหมดที่ทำงานบนเครื่อง สิ่งสำคัญในเรื่องนี้คือการตั้งค่าท่อ Unix นอกเหนือจากการใช้งานไปป์อื่น ๆ คือแนวคิดของการบัฟเฟอร์: ตัวอย่างเช่นโปรแกรมส่งอาจสร้าง 5,000 ไบต์ต่อวินาทีและโปรแกรมรับอาจยอมรับได้ 100 ไบต์ต่อวินาทีเท่านั้น แต่ไม่มี ข้อมูลสูญหาย แต่ผลลัพธ์ของโปรแกรมส่งจะถูกเก็บไว้ในบัฟเฟอร์แทน เมื่อโปรแกรมรับข้อมูลพร้อมที่จะอ่านข้อมูลโปรแกรมถัดไปในไปป์ไลน์จะอ่านจากบัฟเฟอร์ ใน Linux ขนาดของบัฟเฟอร์คือ 65536 ไบต์ (64KB) ตัวกรองบุคคลที่สามโอเพนซอร์สที่เรียกว่า bfr …
36 pipe  history 

4
ทำไม“ tail -f … | หาง” ล้มเหลวในการผลิตผลลัพธ์ใด ๆ
เหตุใดคำสั่งต่อไปนี้จึงไม่สร้างเอาต์พุตใด ๆ $ tail -f /etc/passwd | tail หลังจากอ่านเกี่ยวกับบัฟเฟอร์ฉันได้ลองทำสิ่งต่อไปนี้เพื่อประโยชน์: $ tail -f /etc/passwd | stdbuf -oL tail โปรดทราบว่าต่อไปนี้จะสร้างผลลัพธ์: $ tail /etc/passwd | tail ดังนั้นสิ่งนี้: $ tail -f /etc/passwd | head ฉันใช้ tail version 8.21 (coreutils GNU)
36 pipe  tail 

2
รหัสยกเว้น ANSI ของฉันจะไปที่ใดเมื่อฉันไปที่กระบวนการอื่น ฉันสามารถเก็บไว้ได้ไหม
บางครั้งฉันต้องการที่จะส่งสัญญาณออกมาเป็นสีเช่นกระบวนการ grep ... แต่เมื่อฉันส่งไปยังกระบวนการอื่นเช่น sed, รหัสสีจะหายไป ... มีวิธีในการรักษารหัสเหล่านี้เหมือนเดิมหรือไม่? นี่คือตัวอย่างที่สูญเสียผลลัพธ์สี: echo barney | grep barney | sed -n 1,$\ p

2
หมายเลขลิงก์ / proc / PID / fd / X
ใน Linux /proc/PID/fd/Xลิงก์สำหรับตัวอธิบายไฟล์ที่เป็นไพพ์หรือซ็อกเก็ตจะมีตัวเลขเช่น: l-wx------ 1 user user 64 Mar 24 00:05 1 -&gt; pipe:[6839] l-wx------ 1 user user 64 Mar 24 00:05 2 -&gt; pipe:[6839] lrwx------ 1 user user 64 Mar 24 00:05 3 -&gt; socket:[3142925] lrwx------ 1 user user 64 Mar 24 00:05 4 -&gt; socket:[3142926] lr-x------ 1 user …

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