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

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

2
ฟังก์ชัน Bash ที่รับอินพุตจากพารามิเตอร์หรือไพพ์
ฉันต้องการเขียนฟังก์ชั่นทุบตีต่อไปนี้ในแบบที่มันสามารถรับอินพุตจากอาร์กิวเมนต์หรือไพพ์ได้ b64decode() { echo "$1" | base64 --decode; echo } การใช้งานที่ต้องการ: $ b64decode "QWxhZGRpbjpvcGVuIHNlc2FtZQ=" $ b64decode &lt; file.txt $ b64decode &lt;&lt;&lt; "QWxhZGRpbjpvcGVuIHNlc2FtZQ=" $ echo "QWxhZGRpbjpvcGVuIHNlc2FtZQ=" | b64decode
10 bash  pipe  function  stdin 

1
`นักเทียบท่าบันทึก foo | less` ไม่สามารถค้นหาหรือเลื่อนได้ แต่ `loger log foo 2> & 1 | less` คือ
การใช้ข้อความใดข้อความหนึ่งให้อ่านได้ แต่เฉพาะกับการเปลี่ยนเส้นทาง stderr สามารถหนึ่งเลื่อนหรือพิมพ์ / somepattern และได้รับการแข่งขัน หากไม่มีการค้นหาจะให้ "ไม่มีอะไรให้ค้นหา (กด RETURN)" และคอลัมน์ของ ~ ให้ stderr และ stdout ไม่เหมือนกัน แต่ทำไมแสดงน้อยกว่าพวกเขาเหมือนกันจนกว่าฉันจะเริ่มทำอะไรน้อย นี่อาจเป็นสิ่งที่หลายหน้าต่างแปลก ๆ ที่ฉันไม่เข้าใจ คิด?
10 pipe  less  stdout  stderr 

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 ทำงานเหมือนที่ฉันต้องการ …

3
วิธีแก้ไขเอาต์พุตในไพพ์ไลน์คำสั่ง bash
ตัวอย่างเช่นฉันได้รับคำสั่งจากบางบรรทัด $ some-command John Bob Lucy ตอนนี้ฉันต้องการเพิ่มคำสั่ง chaining ที่แก้ไขเอาต์พุต $ some-command | other-command Hi John Bye Hi Bob Bye Hi Lucy Bye จะเขียนยังother-commandไงดี? (ฉันเป็นสามเณรในทุบตี)
10 bash  pipe 

4
การสร้างสตรีมเอาต์พุตเดี่ยวจากสามสตรีมอื่นที่สร้างแบบขนาน
ฉันมีข้อมูลสามชนิดที่มีรูปแบบต่างกัน สำหรับแต่ละชนิดข้อมูลมีสคริปต์ Python ที่แปลงเป็นรูปแบบรวมเป็นหนึ่งเดียว สคริปต์ Python นี้ช้าและ CPU ที่ถูกผูกไว้ (เพื่อหลักเดียวในเครื่องแบบ multi-core) ดังนั้นฉันต้องการที่จะทำงานสามกรณีของมัน - หนึ่งสำหรับแต่ละชนิดข้อมูล - sortและรวมการส่งออกของพวกเขาจะผ่านมันเข้าไป โดยทั่วไปเทียบเท่ากับสิ่งนี้: { ./handle_1.py; ./handle_2.py; ./handle_3.py } | sort -n แต่ด้วยสามสคริปต์ที่ทำงานในแบบคู่ขนาน ฉันพบคำถามนี้ที่ GNU splitถูกใช้เพื่อปัดเศษสตรีม stdout บางส่วนระหว่าง n อินสแตนซ์ของสคริปต์ที่จัดการสตรีม จากหน้าแยกคน: -n, --number=CHUNKS generate CHUNKS output files. See below CHUNKS may be: N split into N files …

2
เป็นไปได้หรือไม่ที่จะทำตามคำสั่ง (ทำงานซ้ำ ๆ )? เป็นหนึ่งจะติดตามไฟล์โดยใช้ tail -f?
ฉันมีสคริปต์ที่สร้างไฟล์ 'Detail.out' ฉันรู้ว่าสคริปต์จะเสร็จสมบูรณ์เมื่อใดก็ตามที่ไฟล์มีจำนวนบรรทัดที่แน่นอน (ประมาณ 21025) ดังนั้นฉันพบว่าตัวเองกำลังนั่งอยู่ที่พร้อมท์คำสั่งทำงาน: [me@somewhere myDir]$ wc -l */Detail.out 21025 A/Detail.out 21025 B/Detail.out 21025 C/Detail.out 12995 D/Detail.out 10652 E/Detail.out 3481 F/Detail.out 21027 G/Detail.out 21025 H/Detail.out 21025 I/Detail.out ... ... ฉันเคยtail -fดูไฟล์เฉพาะ แต่ฉันต้องการติดตามผลลัพธ์ของwc -l */Detail.outคำสั่งที่แสดงด้านบน เป็นไปได้ไหม ฉันกำลังใช้งานtcshใน Ubuntu 11.04 ถ้าเป็นเช่นนั้น
10 monitoring  pipe  tail 

2
จะทำให้การอ่านและเขียนไฟล์เดียวกันในไปป์ไลน์เดียวกันเสมอ“ ล้มเหลว” ได้อย่างไร?
ว่าฉันมีสคริปต์ต่อไปนี้: #!/bin/bash for i in $(seq 1000) do cp /etc/passwd tmp cat tmp | head -1 | head -1 | head -1 &gt; tmp #this is the key line cat tmp done ในบรรทัดสำคัญฉันอ่านและเขียนไฟล์เดียวกันtmpซึ่งบางครั้งล้มเหลว (ฉันอ่านมันเป็นเพราะสภาพการแข่งขันเพราะกระบวนการในไปป์ไลน์ถูกดำเนินการแบบขนานซึ่งฉันไม่เข้าใจว่าทำไม - แต่ละคนheadจำเป็นต้องใช้ข้อมูลจากข้อมูลก่อนหน้านี้ใช่ไหมนี่ไม่ใช่คำถามหลักของฉัน แต่คุณสามารถตอบได้เช่นกัน) เมื่อฉันเรียกใช้สคริปต์มันจะส่งออกประมาณ 200 บรรทัด มีวิธีใดบ้างที่ฉันสามารถบังคับให้สคริปต์นี้ให้ผลลัพธ์เสมอ 0 บรรทัด (ดังนั้นการเปลี่ยนเส้นทาง I / O ไปยังจะtmpถูกเตรียมไว้ก่อนเสมอและข้อมูลจะถูกทำลายเสมอ) เพื่อความชัดเจนฉันหมายถึงการเปลี่ยนการตั้งค่าระบบไม่ใช่สคริปต์นี้ ขอบคุณสำหรับความคิดของคุณ

1
ไพพ์เอาต์พุตของสคริปต์ทุบตีหลังจากเปลี่ยนเส้นทาง stderr [ปิด]
ปิด คำถามนี้ต้องการรายละเอียดหรือความคมชัด ไม่ยอมรับคำตอบในขณะนี้ ต้องการปรับปรุงคำถามนี้หรือไม่ เพิ่มรายละเอียดและชี้แจงปัญหาโดยแก้ไขโพสต์นี้ ปิดให้บริการใน2 ปีที่ผ่านมา เพราะวิธีที่ผู้ให้บริการทำสิ่งที่ฉันต้องใช้ระบบสำหรับบริการ บริการนี้มีไฟล์ที่เรียกใช้ซึ่งจะเรียกใช้และไพพ์ลงในไฟล์รันที่สอง แต่ฉันใช้แพ็กเกจหลาม (ที่ได้รับ) ที่บันทึกไปยัง stderr แทนที่จะเป็น stdout และฉันไม่สามารถทำสิ่งที่ฉันต้องการได้ ดังนั้นฉันจึงมีสคริปต์รันสำหรับบริการของฉัน: #!/bin/sh cd ~/webapp/PriceList exec python3.4 ~/webapp/PriceList/src/main.py ซึ่งถูกไพพ์ไปที่การรันของระบบการบันทึก: #!/bin/sh exec multilog t ./main แต่ท่อไม่ได้เชื่อมต่อ stderr (ตามที่คาดไว้) ดังนั้นหลังจาก googling ฉันผนวกการเปลี่ยนเส้นทางไปยังการทำงานของฉัน: #!/bin/sh cd ~/webapp/PriceList exec python3.4 ~/webapp/PriceList/src/main.py 2&gt;&amp;1 แต่สิ่งนี้ไม่ช่วยแก้ปัญหาของฉัน: ผลลัพธ์ของฉัน (ไปยัง stdout โดยใช้การพิมพ์ pythons) จะถูกบันทึกตามที่คาดไว้ เอาต์พุต …

4
วิธีอ่านอินพุตของผู้ใช้จากไปป์?
สมมติว่าฉันมีไฟล์ชื่อที่confirmation.shมีเนื้อหาดังต่อไปนี้: #!/bin/bash echo -n "Are you sure [Y/n]? " read line case "$line" in n|N) echo "smth" ;; y|Y) echo "smth" ;; esac และฉันต้องการเรียกใช้สคริปต์นี้ด้วยวิธีต่อไปนี้: cat confirmation.sh | sh ฉันเห็นAre you sure [Y/n]?และสคริปต์ถูกขัดจังหวะ มีปัญหาอะไร?

6
จะรวมข้อความกับข้อความระบบได้อย่างไร
ตัวอย่างเช่นฉันต้องการเขียนคำสั่งที่แสดงเวลาและวันที่ของระบบ จากนั้นฉันต้องการผลลัพธ์เป็นเช่นนี้ The system time is Mon Jan 01 01:01:01 AST 2011. ฉันรู้คำสั่งที่แสดงเวลาของระบบdateแต่จะเพิ่ม"The system time is"ที่ด้านหน้าของเอาต์พุตได้อย่างไร มันควรเป็นecho The system time is + %#%@^ + dateแบบนั้นเหรอ?

3
วิธีการหยุด `grep 'จากการตัดทอนเอาต์พุตท่อ
มีวิธีใดที่จะมีechoที่ส่วนท้ายของไพพ์เพียงต่อท้ายเอาต์พุตปัจจุบันแทนที่จะลบทั้งหมดหรือไม่? ตัวอย่างเช่นฉันจะเก็บเอาท์พุทของฉันcatและgrepและเพิ่ม "END OF OUTPUT" ในตอนท้ายของเอาต์พุตจากไพพ์เดียวกันได้อย่างไร: $ cat file.txt | grep 'foo' | echo "END OF OUTPUT" something foo foo foo something END OF OUTPUT คล้ายกับวิธีการcat -ทำงาน: echo "START OF OUTPUT" | cat - file.txt
2 bash  pipe  echo 
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.