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

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

3
ส่งออกโดยตรงไปยังท่อและ stdout
ฉันสงสัยว่ามีวิธีที่จะส่งออกท่อของคำสั่งและตรงไปยัง stdout ตัวอย่างเช่นfortuneพิมพ์คุกกี้โชคลาภและคัดลอกไปยังคลิปบอร์ด: $ fortune | tee &gt;(?stdout?) | pbcopy "...Unix, MS-DOS, and Windows NT (also known as the Good, the Bad, and the Ugly)." (By Matt Welsh)
14 bash  pipe  stdout  tee 

5
ฉันจะกรองเนื้อหาของไฟล์ tar สร้างไฟล์ tar อื่นในไพพ์ได้อย่างไร
พิจารณาไฟล์ tar เดียวจากระบบภายนอกซึ่งมีบางไดเรกทอรีที่มีคุณลักษณะต่าง ๆ ที่ฉันต้องการเก็บไว้เช่นการอนุญาต, mtimes เป็นต้นฉันจะนำชุดย่อยของไฟล์เหล่านี้มาเป็นผู้ใช้ปกติได้อย่างไร (ไม่ใช่รูท)? กำลังมองหาสิ่งที่ชอบ: tar -f some.tar.gz --subset subdir/ | ssh remote@system tar xvz นอกจากนี้ยังจำเป็นที่จะต้องรักษาแอตทริบิวต์หลัก (ความเป็นเจ้าของกลุ่มโหมด mtime) ในไฟล์เก็บถาวร tar นี้ สิ่งที่เกี่ยวกับคุณลักษณะอื่น ๆ ในไฟล์ tar เช่นคำหลักส่วนหัวขยาย ? คะแนนโบนัสสำหรับโซลูชันที่หลีกเลี่ยงการใช้ไดเรกทอรีชั่วคราวในกรณีที่ subdir นี้มีไฟล์ขนาดใหญ่
13 pipe  tar 

4
วิธีใช้ sed เพื่อจัดการเอาต์พุตสตรีมมิ่งอย่างต่อเนื่อง?
ฉันกำลังรวบรวมการนำเสนอสำหรับผู้ชมที่ไม่ใช่ด้านเทคนิค ฉันมีโปรแกรมที่ทำงานในการทุบตีที่ส่งออกกระแสอย่างต่อเนื่องของค่าบางอย่างที่มีความสำคัญ ฉันต้องการเน้นผลลัพธ์ที่สำคัญตามที่ปรากฏเพื่อให้ผู้ชมได้รับแนวคิดเกี่ยวกับความถี่ของพวกเขา ปัญหาคือฉันไม่สามารถsedทำงานบนสตรีมที่กำลังทำงานอยู่ได้ มันทำงานได้ดีถ้าฉันใส่ผลลัพธ์ลงในไฟล์เช่นเดียวกับใน: cat output.txt | sed "s/some text/some text bolded/" แต่ถ้าฉันลองแบบเดียวกันกับเอาต์พุตที่กำลังทำงานอยู่เช่นนี้ command | sed "s/some text/some text bolded/" sedไม่ทำอะไรเลย ความคิดใด ๆ ขณะที่แลมเบิร์ตมีประโยชน์พอที่จะชี้ให้เห็นคำพูดของฉันที่sedไม่ทำอะไรคลุมเครือ สิ่งที่เกิดขึ้นคือการที่เอาท์พุทโปรแกรมstdout(ฉันค่อนข้างมั่นใจว่ามันไม่ได้เขียนไปstderr) sedตามที่ปกติแม้ว่ามันประปาผ่าน ปัญหาน่าจะเป็นที่คำสั่งเรียกโปรแกรมที่สองซึ่งจากนั้นส่งออกไปยัง stdout มีบางบรรทัดที่พิมพ์โดยโปรแกรมแรก สิ่งเหล่านี้ฉันสามารถแก้ไขได้ จากนั้นจะมีกระแสของค่าที่พิมพ์โดยโปรแกรมที่สอง สิ่งเหล่านี้ฉันไม่สามารถแก้ไขได้ วิธี Perl และ awk ไม่ทำงานเช่นกัน

4
ท่อ {รายการ; } ใช้ได้กับบางโปรแกรมเท่านั้น
ต้องการคำอธิบายจากผู้ใช้ระดับสูงสำหรับพฤติกรรมที่คาดเดาไม่ได้เช่น: ps -eF | { head -n 1;grep worker; } UID PID PPID C SZ RSS PSR STIME TTY TIME CMD root 441 2 0 0 0 2 paź15 ? 00:00:00 [kworker/2:1H] ทุกอย่างดูโอเคในขณะที่ ls -la / | { head -n 1;grep sbin; } แสดงเฉพาะเอาต์พุตจาก head ... ฉันคิดstdout 2&gt;&amp;1และไม่ทำงานไม่ได้สำหรับฉันมันแปลกคำอธิบายใด ๆ หรือแนะนำวิธีจัดการกับมัน?
13 shell  pipe 

3
ฉันจะใช้ tee เพื่อเปลี่ยนเส้นทางไปยัง grep ได้อย่างไร
ฉันไม่ค่อยมีประสบการณ์ในการใช้เสื้อยืดดังนั้นฉันหวังว่านี่จะไม่ธรรมดา หลังจากที่ได้ดูหนึ่งในคำตอบที่จะคำถามนี้ฉันมาข้าม beheviour teeแปลก เพื่อให้ฉันออกบรรทัดแรกและบรรทัดที่พบฉันสามารถใช้สิ่งนี้: ps aux | tee &gt;(head -n1) | grep syslog USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND syslog 806 0.0 0.0 34600 824 ? Sl Sep07 0:00 rsyslogd -c4 อย่างไรก็ตามครั้งแรกที่ฉันรันสิ่งนี้ (เป็น zsh) ผลลัพธ์อยู่ในลำดับที่ไม่ถูกต้องส่วนหัวคอลัมน์จะต่ำกว่าผลลัพธ์ grep (นี่ไม่ได้เกิดขึ้นอีกแล้ว) ดังนั้นฉันจึงพยายามสลับคำสั่งรอบ ๆ : ps aux | tee …

1
ฉันสับสนว่าทำไม“ | true "ใน makefile มีผลเหมือนกับ" || ความจริง”
ฉันมี makefile ที่ฉันหยุดบริการก่อนที่จะลบไฟล์ เมื่อไม่สามารถหยุดบริการได้ก็จะเกิดข้อผิดพลาด นี้ชัดเจนไม่พึงประสงค์ดังนั้นฉันคิดว่าฉันต้องการเพิ่มแต่พลาด|| true |ทำให้มัน: stop service foo | true rm /etc/init/foo.conf ฉันสับสนว่าทำไมสิ่งนี้ถึงใช้ได้และสิ่งที่เกิดขึ้น นี่หมายความว่าtrueเป็นแอปพลิเคชั่นไม่ใช่แค่คำหลัก พวกเขาเหมือนกันหรือไม่ มีเหตุผลที่ดีที่จะใช้| trueหรือไม่
13 shell  pipe 

2
การสื่อสารระหว่างหลายกระบวนการ
ฉันมีสคริปต์ทุบตีซึ่งทำงานเป็นผู้จัดการ () ฟังก์ชั่นเป็นกระบวนการที่แยกต่างหากสำหรับ x- ครั้ง เป็นไปได้อย่างไรที่จะส่งต่อข้อความถึงกระบวนการทั้งหมด () จากผู้จัดการภายในสคริปต์? ฉันได้อ่านเกี่ยวกับไพพ์นิรนามแล้ว แต่ฉันไม่รู้ว่าจะแชร์ข้อความกับมันได้อย่างไรฉันลองทำมันด้วยชื่อไพพ์ แต่ดูเหมือนว่าฉันจะต้องสร้างไพพ์ที่มีชื่อแยกต่างหากสำหรับแต่ละกระบวนการ? วิธีที่สง่างามที่สุดในการทำเช่นนี้คืออะไร? นี่คือรหัสของฉัน: #!/bin/bash manager () { while : do echo "read what has been passed to \$line" done } x=1 while [ $x -le 5 ] do manager x &amp; x=$(( $x + 1 )) done while : do …

2
Piping output จากโปรแกรม segfaulting
ฉันมีสคริปต์ที่เรียกใช้โปรแกรม (โดยเฉพาะttf2afmส่วนหนึ่งของ tetex 3.0) ซึ่งบางครั้ง segfaults และบางครั้งก็ไม่มี ข้อมูลที่ฉันต้องการจะพิมพ์ออกมาเสมอก่อนที่จะแยก segfaults แต่ฉันประสบปัญหาในการหยุดการเปลี่ยนเส้นทางไปป์จากความล้มเหลวและไม่ส่งออกข้อมูลใด ๆ ไปยังไพพ์เมื่อโปรแกรมล้มเหลว ฉันได้ลองเปลี่ยนเส้นทางผ่าน FIFO วงเล็บกระบวนการด้วยtrueตอนท้ายเรียกใช้จากฟังก์ชั่นเชลล์และการเข้ารหัสsh -cแต่ดูเหมือนว่าสคริปต์จะไม่ยอมให้กระบวนการส่งผลอะไรออกไป ฉันรู้ว่ามันมีความสามารถในการส่งออกเนื่องจากมันสามารถให้ได้อย่างสมบูรณ์จากบรรทัดคำสั่ง แต่ไม่ใช่จากสคริปต์ด้วยเหตุผลบางอย่าง คำถามของฉันคือมีวิธีใดบ้างที่สคริปต์จะเพิกเฉยต่อความจริงที่ว่าโปรแกรม segfaults และให้ผลลัพธ์กับฉันหรือไม่ ฉันใช้ BASH 4.1.10 (2) - ปล่อย

2
พารามิเตอร์การโทรที่ถูกผูกมัดกับโปรแกรมอรรถประโยชน์ใน Bash
ฉันมีโปรแกรมยูนิกซ์กล่องดำที่ใช้ใน Bash shell ที่อ่านคอลัมน์ข้อมูลจาก stdin ประมวลผลพวกมัน (ใช้เอฟเฟกต์การปรับให้เรียบ) จากนั้นก็ส่งออกไปยัง stdout ฉันใช้มันโดย UNIX ไพพ์เช่น generate | smooth | plot สำหรับการปรับให้เรียบมากขึ้นฉันสามารถทำซ้ำแบบราบรื่นได้ดังนั้นจึงสามารถเรียกใช้จากบรรทัดคำสั่ง Bash เป็น generate | smooth | smooth | plot หรือแม้กระทั่ง generate | smooth | smooth | smooth | smooth | smooth | smooth | smooth | smooth | smooth | smooth | …

1
โปรแกรมรู้ได้อย่างไรว่า stdout เชื่อมต่อกับเทอร์มินัลหรือไปป์?
ฉันมีปัญหาในการดีบั๊กโปรแกรม segfaulting เพราะ ouput ที่ถูกต้องก่อน segfault คือสิ่งที่ฉันต้องการ แต่สิ่งนี้จะหายไปหากฉันกำลังไพพ์เอาต์พุตไปยังไฟล์ ตามคำตอบนี้: /unix//a/17339/22615นี่เป็นเพราะบัฟเฟอร์เอาต์พุตของโปรแกรมจะล้างออกทันทีเมื่อเชื่อมต่อกับเทอร์มินัล แต่จะอยู่ที่จุดเฉพาะเมื่อเชื่อมต่อกับไพพ์ คำถามสองสามข้อที่นี่: โปรแกรมกำหนดว่า stdout เชื่อมต่อกับอะไรได้อย่างไร คำสั่ง "สคริปต์" สร้างพฤติกรรมเช่นเดียวกับเมื่อโปรแกรมเขียนไปยังเทอร์มินัลอย่างไร สามารถทำได้โดยไม่ใช้คำสั่งสคริปต์หรือไม่
12 terminal  pipe 

2
การใช้ jq ภายใน chain pipe จะไม่สร้างเอาต์พุต
ปัญหาของการjqต้องการตัวกรองที่ชัดเจนเมื่อมีการกล่าวถึงผลลัพธ์ของการเปลี่ยนเส้นทางไปทั่วเว็บ แต่ฉันไม่สามารถเปลี่ยนเส้นทางผลลัพธ์หากjqเป็นส่วนหนึ่งของไพพ์เชนแม้ว่าจะใช้ตัวกรองอย่างชัดเจนก็ตาม พิจารณา: touch in.txt tail -f in.txt | jq '.f1' # in a different terminal: echo '{"f1":1,"f2":2}' &gt;&gt; in.txt echo '{"f1":3,"f2":2}' &gt;&gt; in.txt ตามที่คาดไว้เอาต์พุตในเทอร์มินัลดั้งเดิมจากjqคำสั่งคือ: 1 3 แต่ถ้าฉันเพิ่มการเปลี่ยนเส้นทางหรือการวางท่อใด ๆ ที่ส่วนท้ายของjqคำสั่งเอาต์พุตจะเงียบ rm in.txt touch in.txt tail -f in.txt | jq '.f1' | tee out.txt # in a different terminal: echo '{"f1":1,"f2":2}' …

1
สัญลักษณ์แปลก ๆ บนหน้าจอเมื่อใช้ grep?
มีความคิดอะไรที่ทำให้เกิดสิ่งนี้ สิ่งเดียวที่แสดงคือรหัส ISO และพื้นที่ว่างโดยไม่ใช้ grep ซอฟต์แวร์ที่ใช้ คำสั่ง: ./trans --id --input /path/to/txt | grep ISO | grep [a-z] root@box /test # alias grep alias grep='grep --color=auto' root@box /test # type grep grep is aliased to `grep --color=auto' เอาท์พุทปกติ:

5
ทำไมฉันไม่สามารถส่ง "pwd" ถึง "open" บน macOS ได้
นี่เป็น MacOS ที่เฉพาะเจาะจง แต่ดูเหมือนว่าไม่น่าที่จะไปอยู่ในชุมชนAsk Different ในเทอร์มินัลฉันสามารถpwdคัดลอกผลลัพธ์แล้วพิมพ์openและวางผลลัพธ์แล้วโฟลเดอร์จะเปิดในตัวค้นหา แต่ pwd | open openพิมพ์เอกสารความช่วยเหลือสำหรับ ทำไมการวางท่อไม่ทำงาน แต่การวางไม่ได้
12 osx  pipe 

3
SSH: ระบุ "ท่อ" fds เพิ่มเติมนอกเหนือจาก stdin, stdout, stderr
เมื่อเชื่อมต่อไปยังโฮสต์กับ SSH มักจะสาม "ท่อ" ที่มีให้ระหว่างเจ้าภาพและแขกสำหรับstdin, และstdoutstderr มีตัวเลือกบรรทัดคำสั่งเพื่อส่งต่อสำหรับตัวอธิบายไฟล์เพิ่มเติม ( 3เป็นต้นไป) หรือไม่? ตัวอย่างเช่นฉันต้องการทำ ssh --forwardfd=10:3 remotehost 'echo test &gt;&amp;3' ซึ่งจะพิมพ์ 'ทดสอบ' ไปยังตัวอธิบายไฟล์ที่เปิดในเครื่อง 10

4
เพราะเหตุใดจึงไม่ได้มีการส่งข้อมูลนโยบายที่ฉลาด - แคช
ไม่เข้าใจสาเหตุ $ apt-cache policy foo N: Unable to locate package foo แต่ $ apt-cache policy foo 2&gt;&amp;1 | grep . มันว่างเปล่า. ฉันกำลังทำข้อสันนิษฐานผิด งานเดิม: ฉันต้องประมวลapt-cache policyผลเอาท์พุทน่าจะเป็น :-) UPD : fooใช้ในตัวอย่างของฉันอาจถูกแทนที่ด้วยชื่อแพคเกจใด ๆ ที่ไม่มีอยู่ในapt-getดัชนีของคุณ UPD 2 : มีคำตอบสำหรับวิธีแก้ปัญหา +50เงินรางวัลเพิ่มเติมจะมอบให้กับทุกคนที่อธิบายว่าทำไม2&gt;&amp;1โซลูชันไม่ทำงาน
12 shell  apt  pipe 

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