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

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

3
การอ่านอย่างต่อเนื่องจากไปป์ที่มีชื่อ (cat หรือ tail -f)
ฉันได้กำหนดค่าrsyslogให้บันทึกเหตุการณ์การบันทึกบางอย่างไปที่/dev/xconsole: *.*;cron.!=info;mail.!=info |/dev/xconsole /dev/xconsoleเป็นชื่อไปป์ ( fifo) cat /dev/xconsoleถ้าผมต้องการที่จะเห็นสิ่งที่จะถูกบันทึกไว้ที่ฉันสามารถทำได้ ฉันกำลังแปลกใจที่จะเห็นว่าคำสั่งcat /dev/xconsoleไม่เสร็จสมบูรณ์หลังจากที่ได้อ่านไฟล์ tail -fแต่แทนที่จะทำหน้าที่เป็น กล่าวอีกนัยหนึ่งทั้งสองคำสั่งทำงานเหมือนกัน: cat /dev/xconsole tail -f /dev/xconsole ใครช่วยอธิบายหน่อยได้ไหมว่าเพราะอะไร มีความแตกต่างระหว่างสองคนนี้ไหม?
16 pipe  cat  tail  fifo 

2
ความแตกต่างระหว่าง STDIN และอาร์กิวเมนต์ที่ส่งผ่านไปยังคำสั่งคืออะไร
ฉันสามารถใช้ทั้งสองรูปแบบเพื่อดำเนินการcatวิธีการ: cat file_name cat &lt; file_name ผลลัพธ์จะเหมือนกัน จากนั้นฉันต้องการที่จะดำเนินการmanในรูปแบบของstdin man &lt; file_name ในขณะที่file_nameมี: # file_name cat แต่ก็ปรากฏขึ้น แทนการดำเนินการWhat manual page do you want?man cat ฉันต้องการทราบว่าทำไมcatสามารถยอมรับstdinเป็นข้อโต้แย้ง แต่manไม่สามารถ และสิ่งที่แตกต่างระหว่างอาร์กิวเมนต์บรรทัดคำสั่งและstdin?

3
หัวกินอักขระพิเศษ
คำสั่ง shell ต่อไปนี้คาดว่าจะพิมพ์บรรทัดคี่ของอินพุตสตรีมเท่านั้น: echo -e "aaa\nbbb\nccc\nddd\n" | (while true; do head -n 1; head -n 1 &gt;/dev/null; done) aaaแต่มันเป็นเพียงแค่พิมพ์บรรทัดแรก: สิ่งเดียวกันจะไม่เกิดขึ้นเมื่อใช้กับตัวเลือก-c( --bytes): echo 12345678901234567890 | (while true; do head -c 5; head -c 5 &gt;/dev/null; done) คำสั่งนี้ส่งออก1234512345ตามที่คาดไว้ แต่นี้จะทำงานเฉพาะในcoreutilsการดำเนินงานของheadยูทิลิตี้ busybox12345การดำเนินงานยังคงกินอักขระพิเศษเพื่อการส่งออกเป็นเพียง ฉันเดาว่าวิธีการใช้งานเฉพาะอย่างนี้ทำเพื่อการเพิ่มประสิทธิภาพ คุณไม่สามารถรู้ได้ว่าเส้นไหนจะจบลงดังนั้นคุณจะไม่ทราบว่าต้องอ่านตัวอักษรกี่ตัว วิธีเดียวที่จะไม่ใช้อักขระพิเศษจากอินพุตสตรีมคือการอ่านสตรีมไบต์เป็นไบต์ แต่การอ่านจากสตรีมทีละหนึ่งไบต์อาจช้า ดังนั้นฉันเดาว่าheadอ่านอินพุตสตรีมไปยังบัฟเฟอร์ใหญ่พอสมควรแล้วนับจำนวนบรรทัดในบัฟเฟอร์นั้น ไม่สามารถพูดแบบเดียวกันสำหรับกรณีได้เมื่อใช้--bytesตัวเลือก ในกรณีนี้คุณรู้จำนวนไบต์ที่คุณต้องอ่าน ดังนั้นคุณอาจอ่านจำนวนไบต์นี้อย่างแน่นอนและไม่มากกว่านั้น corelibsการดำเนินการจะใช้โอกาสนี้ แต่busyboxหนึ่งไม่ก็ยังคงอ่านไบต์มากขึ้นกว่าที่จำเป็นเข้าไปในกันชน มันอาจทำเพื่อทำให้การใช้งานง่ายขึ้น ดังนั้นคำถาม …

1
วิธีกรองบรรทัดของเอาต์พุตคำสั่งที่เกิดขึ้นในไฟล์ข้อความ?
forbidden.txtสมมติว่าเรามีไฟล์ข้อความของสายที่ต้องห้าม วิธีสั้น ๆ ในการกรองทุกบรรทัดของเอาต์พุตคำสั่งที่มีอยู่ในไฟล์ข้อความคืออะไร? cat input.txt | exclude-forbidden-lines forbidden.txt | sort
15 shell  pipe  filter 

2
มีวิธีการใช้ xargs ข้ามท่อหรือไม่?
ฉันพยายามแปลงไฟล์ flac ที่ย้ายไปยังโฟลเดอร์เป็น mp3 ในโฟลเดอร์อื่นโดยอัตโนมัติ บรรทัดรหัสปัจจุบันของฉันคือ: inotifywait -m -r -q -e moved_to --format "'%w%f'" ~/test | xargs -I x flac -cd x - | lame -b 320 - /media/1tb/x.mp3 เพื่ออธิบายวิธีการใช้งานจนถึงตอนนี้ inotifywait จอภาพ ~ / ทดสอบวนซ้ำสำหรับไฟล์ที่ย้ายไปที่นั่นเอาท์พุทพา ธ และชื่อไฟล์ไปยังไพพ์ xargs ใช้ชื่อนั้นและสร้างคำสั่ง flac ที่เหมาะสมแทนที่ x ด้วยชื่อไฟล์และถอดรหัสไฟล์ไปยังไพพ์อื่น ในไปป์ใหม่ประมวลผลเอาต์พุตของ flac เป็น mp3 ภายใต้ / สื่อ …
15 shell  pipe  xargs  inotify 

3
วิธีการแสดงจำนวนบรรทัดที่ส่งออกโดยคำสั่งในเวลาจริง?
ฉันใช้svn exportเป็นส่วนหนึ่งของสคริปต์แพ็คเก็ตสำหรับแอปพลิเคชันของฉันและดูเหมือนว่าคำสั่งนี้เหมือนกับคนอื่น ๆ มากมายไม่มีแถบความคืบหน้าใด ๆ ฉันมีสองตัวเลือกในขณะนี้: ใช้งานโดยไม่มีตัวเลือกและดูการพิมพ์หลายพันบรรทัด ใช้--quietและไม่เห็นอะไรจนกว่ามันจะเสร็จสมบูรณ์ อย่างน้อยมีวิธีแสดงจำนวนบรรทัดเอาต์พุตตามคำสั่งแบบเรียลไทม์หรือไม่? เช่น: Exporting SVN directory ... 1234 files และเห็นการ1234 เพิ่มจำนวนนี้ในเวลาจริงหรือไม่ ฉันสามารถจินตนาการว่าการส่งออกไปยังคำสั่งที่จะทำแค่นี้ แต่อันไหน?

3
ใช้เข้า / ออกชื่อไปป์สำหรับการเชื่อมต่อ TCP
ฉันเล่นซอให้เรื่องนี้ทำงานได้ซักพักแล้วดังนั้นฉันจึงสงสัยว่าความเข้าใจผิดพื้นฐานบางอย่างเกี่ยวกับการทำงานของท่อเป็นสาเหตุของปัญหาของฉัน เป้าหมายของฉันคือการเริ่มต้นการเชื่อมต่อ TCP ไปยังรีโมตโฮสต์ผ่านnetcatและมีไพพ์ที่มีชื่อสองไฟล์ในระบบไฟล์: กระบวนการหนึ่งที่กระบวนการสามารถอ่านเพื่อรับข้อมูลขาเข้าและอื่น ๆ ที่กระบวนการสามารถเขียนไปยังข้อมูลขาออก ฉันกำลังใช้สิ่งก่อสร้างต่อไปนี้: mkfifo in mkfifo out cat out | netcat foo.bar.org 4000 &gt; in &amp; จากที่นี่ฉันต้องการอนุญาตให้กระบวนการอื่นอ่านและเขียนไปยัง / จากการเชื่อมต่อ TCP แบบเปิดนี้ ควร "ใช้งานได้" หรือมีเหตุผลว่าทำไมการสร้างเช่นนี้ไม่สามารถใช้งานได้? สิ่งที่ดูเหมือนจะเกิดขึ้นในปัจจุบันคือฉันสามารถอ่านได้outโดยไม่มีปัญหา แต่เมื่อฉันเขียนถึงinฉันรับเอาท์พุทพูดถึงท่อที่ขาดและการสื่อสารที่ตามมาทั้งหมดดูเหมือนจะตาย คิด? (ที่เกี่ยวข้อง: ฉันใช้มา แต่เดิม: netcat foo.bar.org 4000 &lt; out &gt; in &amp; แต่พบว่ามันบล็อกการรอการป้อนข้อมูล ฉันอยากรู้เกี่ยวกับสิ่งนี้เช่นกัน แต่มันอาจจะดีกว่าในคำถามที่แยกต่างหาก)
15 bash  pipe  tcp  netcat 

2
ฉันจะเรียงลำดับโดยใช้คำสั่ง grep และ sort ได้อย่างไร
ผมอยากจะสร้างรายการที่เรียงลำดับของการบริการที่เป็น TCP ทั้งหมดที่พบในไฟล์/etc/services, ท่อส่งออกของคำสั่งgrep tcp /etc/servicesลงไปในคำสั่งแล้วเปลี่ยนเส้นทางออกของท่อนี้ลงในแฟ้มsort~/pipelab.txt ฉันได้รับข้อความแสดงข้อผิดพลาดว่าผลลัพธ์ของฉันไม่ถูกต้องและฉันไม่รู้ว่าทำไม นี่คือสิ่งที่ฉันได้ลองครั้งล่าสุด: grep tcp /etc/services &gt; ~/pipelab.txt | sort
15 shell  pipe 

1
ทำไมการเปลี่ยนเป็น 'หาง' จึงเปลี่ยนเนื้อหาของบรรทัด
เมื่อฉันดูผลลัพธ์ของ a SELECTด้วย MySQL Workbench มันถูกต้องด้วยหนึ่งเดียว\ max@host 10:13:58: ~$ mysql -h db-master.domain.local -uuser -ppw db -e ' &gt; SELECT &gt; DISTINCT i.filesourceregexp &gt; FROM db.ImportLogFiles i' +------------------------------------------------+ | filesourceregexp | +------------------------------------------------+ | ^[0-9]{8}_1062355673_merge_google_pbn\.csv$ | | ^[0-9]{8}_8026062435_merge_google_pbn\.csv$ | | ^[0-9]{8}_1062355673_store_visits_report\.csv$ | +------------------------------------------------+ max@host 10:14:10: ~$ mysql -h db-master.domain.local -uuser -ppw db …
14 pipe  mysql  tail 

3
ท่อ B ถึง D? - A&& B || C | D
มีวิธีการเขียนโครงสร้างคำสั่งอีกครั้งA &amp;&amp; B || C | Dเพื่อให้ B หรือ C ถูกไพพ์ลงใน D หรือไม่? ด้วยคำสั่งปัจจุบันเพียง B หรือทั้ง C และ D จะทำงาน ตัวอย่างเช่น:
14 bash  pipe 

9
กรองหรือไพพ์บางส่วนของไฟล์
ฉันมีไฟล์อินพุตที่มีบางส่วนและถูกแบ่งเขตด้วยแท็กเริ่มต้นและแท็กสิ้นสุดตัวอย่างเช่น: line A line B @@inline-code-start line X line Y line Z @@inline-code-end line C line D ฉันต้องการนำการแปลงไปใช้กับไฟล์นี้เพื่อให้บรรทัด X, Y, Z ถูกกรองผ่านคำสั่งบางอย่าง ( nlตัวอย่างเช่น) แต่ส่วนที่เหลือของบรรทัดนั้นไม่ผ่านการเปลี่ยนแปลง โปรดสังเกตว่าnl(จำนวนบรรทัด) สะสมสถานะข้ามบรรทัดดังนั้นจึงไม่ใช่การแปลงแบบสแตติกที่ถูกนำไปใช้กับแต่ละบรรทัด X, Y, Z ( แก้ไข : มันชี้ให้เห็นว่าnlสามารถทำงานในโหมดที่ไม่ต้องการสถานะสะสม แต่ฉันแค่ใช้nlเป็นตัวอย่างในการทำให้คำถามง่ายขึ้นในความเป็นจริงคำสั่งเป็นสคริปต์ที่กำหนดเองที่ซับซ้อนมากขึ้นสิ่งที่ฉันกำลังมองหา for เป็นคำตอบทั่วไปสำหรับปัญหาในการใช้ตัวกรองมาตรฐานกับส่วนย่อยของอินพุตไฟล์ ) ผลลัพธ์ควรมีลักษณะดังนี้: line A line B 1 line X 2 line Y 3 …

1
ความคิดเห็นที่อ่านได้ในแต่ละบรรทัดในคำสั่ง bash แบบหลายบรรทัดพร้อมไพพ์ไลน์
เมื่อสร้างเชลล์สคริปต์โดยใช้ไพพ์ไลน์และการใช้แบ็กสแลชเพื่อดำเนินการต่อบรรทัดฉันต้องการแทรกความคิดเห็นบนบรรทัดแยกในแฟชั่นที่แข็งแกร่งอ่านได้และพกพาได้ ตัวอย่างเช่นให้ใช้คำสั่งหลายบรรทัดที่ไม่ใส่เครื่องหมาย (ถูกขโมยจาก @DigitalRoss เพื่อความชัดเจน): echo abc | tr a-z A-Z | sort | uniq ... ด้านล่างมีความสวยงามใกล้เคียงกับสิ่งที่ฉันต้องการให้สำเร็จ แต่ด้วยเหตุผลที่ชัดเจนไม่ทำงาน ... และใช่ฉันทราบดีว่านี่ไม่ใช่สิ่งที่ควรค่าแก่การแสดงความคิดเห็น: # Perform critical system task. # NOTE - An example of what does *not* work. echo abc | # Convert lowercase to uppercase. tr a-z A-Z | # Sort the …
14 bash  shell  pipe 



5
ยูทิลิตี้เพื่อบัฟเฟอร์จำนวนข้อมูลที่ไม่ จำกัด ในไปป์ไลน์หรือไม่?
มียูทิลิตี้ที่ฉันสามารถติดในไปป์ไลน์เพื่อแยกความเร็วในการอ่านและเขียนได้หรือไม่? $ producer | buf | consumer โดยทั่วไปฉันต้องการยูทิลิตี้bufที่อ่านอินพุตเร็วที่สุดเท่าที่จะเป็นไปได้เก็บไว้ในหน่วยความจำเพื่อให้consumerสามารถใช้ช่วงเวลาที่หวานในขณะที่producerรันเร็วที่สุด
14 pipe  io  buffer 

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