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

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

3
ฉันจะเปลี่ยนทิศทางเอาต์พุต "time" และเอาต์พุตคำสั่งไปยังไพพ์เดียวกันได้อย่างไร
fooสมมติว่าฉันมีไบนารีที่เรียกว่า หากฉันต้องการเปลี่ยนเส้นทางผลลัพธ์fooไปยังกระบวนการอื่นbarฉันสามารถเขียน./foo | barได้ ในทางกลับกันถ้าฉันต้องการtimefoo และเปลี่ยนเส้นทางผลลัพธ์ของtimeฉันสามารถเขียน, time (./foo) | bar. คำถามของฉันคือฉันจะติดเอาท์พุทของtimeไปยังจุดสิ้นสุดของการส่งออกfooและท่อผ่านท่อเดียวกันได้อย่างไร วิธีการแก้ปัญหาต่อไปนี้เป็นไม่ได้สิ่งที่ฉันกำลังมองหาเพราะมันเริ่มต้นสองกรณีแยกต่างหากของกระบวนการในขณะที่ฉันต้องการท่อที่ใช้ร่วมกันเดียวกับเช่นเดียวของbarbar time (./foo | bar) | bar สำหรับผู้ที่อยากรู้อยากเห็นเหตุผลที่ไม่ต้องการเริ่มต้นสองอินสแตนซ์ของbarเพราะbarเป็นเครือข่ายลูกค้าและฉันต้องการข้อมูลเวลาที่จะถูกส่งไปยังเซิร์ฟเวอร์เป็นส่วนหนึ่งของhttp POSTข้อความเดียวกันเป็นผลลัพธ์ของกระบวนการ

1
ค้นหาและ rsync?
ฉันต้องการที่จะสามารถค้นหาไฟล์ในช่วง 14 วันและนานกว่า 10k และกว่า rsync ที่พบไฟล์ไปยังปลายทาง มีวิธีรวมคำสั่งทั้งสองนี้หรือไม่? find ./ -mtime +14 -size +10k rsync --remove-sent-files -avz /src /dest
24 bash  shell  find  pipe  rsync 

6
ฉันจะทำให้โปรแกรมหลามทำงานอย่างไรเช่นเครื่องมือยูนิกซ์ที่เหมาะสม?
ฉันมีสคริปต์ Python อยู่สองสามตัวและฉันก็กำลังเขียนมันใหม่ ฉันมีปัญหาเดียวกันกับพวกเขาทั้งหมด ฉันไม่เห็นได้ชัดว่าจะเขียนโปรแกรมอย่างไรเพื่อให้พวกเขาทำตัวเหมือนเครื่องมือยูนิกซ์ที่เหมาะสม เพราะสิ่งนี้ $ cat characters | progname และนี่ $ progname characters ควรสร้างผลลัพธ์เดียวกัน สิ่งที่ใกล้เคียงที่สุดที่ฉันสามารถพบได้ใน Python คือไลบรารี fileinput น่าเสียดายที่ฉันไม่เห็นวิธีเขียนสคริปต์ Python ของฉันอีกครั้งซึ่งทั้งหมดมีลักษณะดังนี้: #!/usr/bin/env python # coding=UTF-8 import sys, re for file in sys.argv[1:]: f = open(file) fs = f.read() regexnl = re.compile('[^\s\w.,?!:;-]') rstuff = regexnl.sub('', fs) f.close() print rstuff …

3
การวางท่อ STDERR กับ STDOUT
ตามที่ " ลินุกซ์: อ้างอิงสมบูรณ์ Edition 6 " (. หน้า 44) คุณสามารถท่อเท่านั้น STDERR โดยใช้|&amp;สัญลักษณ์การเปลี่ยนเส้นทาง ฉันได้เขียนสคริปต์เพื่อทดสอบสิ่งนี้: #!/bin/bash echo "Normal Text." echo "Error Text." &gt;&amp;2 ฉันรันสคริปต์นี้เช่นนี้: ./script.sh |&amp; sed 's:^:\t:' สันนิษฐานว่ามีเพียงบรรทัดที่พิมพ์ไปยัง STDERR เท่านั้นที่จะถูกเยื้อง อย่างไรก็ตามมันใช้งานไม่ได้จริง ๆ อย่างที่ฉันเห็น: Normal Text. Error Text. ฉันทำอะไรผิดที่นี่

1
ส่งคำค้นหา (ไม่ใช่ชื่อไฟล์) ไปที่ grep
ฉันต้องการที่จะเลือกสายบางอย่างที่มีจำนวนที่กำหนดจากไฟล์ os_clusters/piRNA_clusters.bedไฟล์ที่ฉันต้องการที่จะค้นหาที่เรียกว่า awk '{if (a[$0]++ == 0) {split($0,b,"."); ;split(b[1],c,"r"); print c[3]}};' test_non_enriched | xargs grep {} os_clusters/piRNA_clusters.bed ส่วนแรกก่อนไปป์ไลน์มันจะสร้างคำที่ต้องการค้นหาเช่น 8707, 8824 เป็นต้นอย่างไรก็ตามส่วนหลังไม่มี awk '' ... | xargs grep {} os_clusters/piRNA_clusters.bed แทนที่จะค้นหาไฟล์เป้าหมายสำหรับคำที่สร้างโดยไพพ์มันจะพิจารณาคำค้นหาเป็นไฟล์อินพุต ดังนั้นฉันได้รับข้อความผิดพลาดเช่น: grep: 8707: No such file or directory grep: 8824: No such file or directory ฉันต้องเปลี่ยนอะไรเพื่อค้นหาไฟล์os_clusters/piRNA_clusters.bedสำหรับคำที่สร้างโดยไพพ์
23 bash  grep  pipe 

4
ยูทิลิตี้ Linux นั้นฉลาดเมื่อใช้คำสั่ง piped หรือไม่?
ฉันเพิ่งรันคำสั่งสองสามคำสั่งในเทอร์มินัลและฉันเริ่มสงสัยว่า Unix / Linux จะใช้ทางลัดเมื่อเรียกใช้คำสั่ง piped หรือไม่ ตัวอย่างเช่นสมมติว่าฉันมีไฟล์ที่มีหนึ่งล้านเส้นแรก 10 hello worldซึ่งประกอบด้วย หากคุณรันคำสั่งคำสั่งgrep "hello world" file | headแรกจะหยุดทันทีที่พบ 10 บรรทัดหรือไม่หรือค้นหาทั้งไฟล์ก่อนหรือไม่

8
วิธีไพพ์เอาต์พุตจากกระบวนการหนึ่งไปยังอีกกระบวนการ แต่จะดำเนินการเฉพาะถ้ากระบวนการแรกมีเอาต์พุตหรือไม่?
ฉันสามารถเขียนคำสั่งนี้ไปยังอีเมลเฉพาะในกรณีที่มีการส่งออกจากmailq | grep? mailq | egrep 'rejected|refused' -A 5 -B 5 | mail -s 'dd' email@email เป็นไปได้ไหมในหนึ่งบรรทัด? ดูที่ตรวจสอบว่าไพพ์ว่างเปล่าและรันคำสั่งกับข้อมูลหากไม่ได้เป็นตัวพิมพ์ใหญ่กว่าการส่งอีเมล
23 shell  pipe 

5
การบีบอัดสตรีมแบบทันทีที่ไม่กระจายไปสู่ทรัพยากรฮาร์ดแวร์?
ฉันมีพื้นที่ว่างบนดิสก์ 200 GB, RAM 16 GB (ที่เดสก์ท็อปและเคอร์เนลประมาณ ~ 1 GB) และ swap 6 GB ฉันมี SSD ภายนอก 240 GB ที่มี 70 GB ใช้1และที่เหลือฟรีซึ่งฉันต้องสำรองข้อมูลลงดิสก์ โดยปกติแล้วฉันต้องการdd if=/dev/sdb of=Desktop/disk.imgดิสก์ก่อนแล้วจึงบีบอัด แต่การสร้างอิมเมจก่อนไม่ใช่ตัวเลือกเนื่องจากการทำเช่นนั้นจะต้องใช้พื้นที่ดิสก์มากกว่าที่ฉันมีแม้ว่าขั้นตอนการบีบอัดจะส่งผลให้พื้นที่ว่างถูกบีบอัดดังนั้น ไฟล์เก็บถาวรสุดท้ายสามารถใส่ลงในดิสก์ของฉันได้อย่างง่ายดาย ddเขียนไป STDOUT โดยค่าเริ่มต้นและgzipสามารถอ่านได้จาก STDIN ดังนั้นในทฤษฎีฉันจะเขียนdd if=/dev/sdb | gzip -9 -แต่gzipจะใช้เวลานานมากในการอ่านไบต์กว่าddสามารถผลิตได้ จากman pipe: ข้อมูลที่เขียนไปยังปลายการเขียนของไพพ์จะถูกบัฟเฟอร์โดยเคอร์เนลจนกว่าจะถูกอ่านจากการอ่านที่ปลายของไพพ์ ฉันเห็นภาพความ|เป็นเหมือนไพพ์จริง - แอปพลิเคชั่นตัวหนึ่งผลักข้อมูลเข้าและอีกอันนำข้อมูลออกจากคิวของไพพ์โดยเร็วที่สุด จะเกิดอะไรขึ้นเมื่อโปรแกรมทางด้านซ้ายเขียนข้อมูลได้เร็วกว่าอีกด้านหนึ่งของไปป์สามารถหวังที่จะประมวลผลได้ มันจะทำให้เกิดการใช้หน่วยความจำมากหรือการแลกเปลี่ยนหรือเคอร์เนลจะพยายามสร้าง FIFO บนดิสก์จึงเติมดิสก์? หรือมันจะล้มเหลวSIGPIPE Broken …
23 pipe  dd  compression  gzip 

4
ความแตกต่างระหว่าง `curl | sh` และ `sh -c“ $ (curl)””?
คำถามนี้ถูกโยกย้ายจาก Server Fault เนื่องจากสามารถตอบได้ใน Unix &amp; Linux Stack Exchange อพยพ 2 ปีที่แล้ว วิธีการติดตั้งง่าย ๆ อย่างหนึ่งสำหรับ Docker (ตัวอย่าง) คือ: curl -sSL https://get.docker.com/ | sh อย่างไรก็ตามฉันได้เห็นบางอย่างที่มีลักษณะเช่นนี้ (โดยใช้ตัวอย่าง Docker): sh -c "$(curl -sSL https://get.docker.com/)" พวกมันดูเหมือนจะใช้งานได้เหมือนกัน แต่มีเหตุผลที่จะใช้อันหนึ่งกับอีกอันหนึ่งหรือไม่? หรือมันเป็นเพียงสิ่งที่ชอบ / ความงาม? (โปรดทราบว่าให้ระมัดระวังเมื่อเรียกใช้สคริปต์จากต้นกำเนิดที่ไม่รู้จัก)

2
ท่อการไหลของข้อมูลในไปป์ไลน์เป็นอย่างไร
ฉันไม่เข้าใจว่าข้อมูลไหลในท่อและหวังว่าใครบางคนสามารถชี้แจงสิ่งที่เกิดขึ้นที่นั่น ฉันคิดว่าไพพ์ไลน์ของคำสั่งประมวลผลไฟล์ (ข้อความ, อาร์เรย์ของสตริง) ในลักษณะทีละบรรทัด (หากคำสั่งแต่ละคำสั่งใช้งานได้ทีละบรรทัด) แต่ละบรรทัดของข้อความจะผ่านไปป์ไลน์คำสั่งจะไม่รอให้การประมวลผลอินพุตทั้งหมดเสร็จสิ้นก่อนหน้า แต่ดูเหมือนว่ามันจะไม่เป็นเช่นนั้น นี่คือตัวอย่างการทดสอบ มีข้อความบางบรรทัด ฉันพิมพ์ใหญ่และทำซ้ำแต่ละบรรทัดสองครั้ง cat text | tr '[:lower:]' '[:upper:]' | sed 'p'ผมทำด้วย ที่จะปฏิบัติตามกระบวนการที่เราสามารถเรียกมันว่า "การโต้ตอบ" - catข้ามชื่อไฟล์การป้อนข้อมูลใน แต่ละส่วนของไปป์ไลน์ทำงานทีละบรรทัด: $ cat | tr '[:lower:]' '[:upper:]' alkjsd ALKJSD sdkj SDKJ $ cat | sed 'p' line1 line1 line1 line 2 line 2 line 2 แต่ไปป์ไลน์ที่สมบูรณ์รอให้ฉันเสร็จสิ้นอินพุตด้วยEOFและจากนั้นพิมพ์ผลลัพธ์: …

2
ในทุบตีอ่านหลังจากท่อไม่ได้ตั้งค่า
แก้ไข: ชื่อเดิมคือ "อ่านล้มเหลวในการทุบตี" ด้วย ksh ฉันใช้อ่านเป็นวิธีที่สะดวกในการแยกค่า: $ echo 1 2 3 4 5 | read a b dump $ echo $b $a 2 1 $ แต่มันล้มเหลวในการทุบตี: $ echo 1 2 3 4 5 | read a b dump $ echo $b $a $ ฉันไม่พบเหตุผลในหน้าคู่มือทำไมจึงล้มเหลวความคิดใด ๆ
22 bash  shell  pipe  read 

7
ใช้การเปลี่ยนเส้นทางเอาต์พุตโดยไม่ได้ตั้งใจ> แทนที่จะไปป์ |
เดือนที่แล้วฉันเขียนสคริปต์ Python เพื่อจับคู่ MAC และที่อยู่ IP จาก stdin และเมื่อสองวันก่อนฉันจำได้และเคยกรองเอาท์พุทของtcpdumpแต่มันผิดไปเพราะการพิมพ์ผิด ฉันพิมพ์ tcpdump -ne &gt; ./mac_ip.py และผลลัพธ์คืออะไร แต่ผลลัพธ์ควรเป็น "ไม่ทราบ" หากไม่สามารถแยกวิเคราะห์อินพุตดังนั้นฉันได้cat ./mac_ip.pyและพบข้อมูลทั้งหมดtcpdumpแทนที่จะเป็นโปรแกรม จากนั้นฉันก็ตระหนักว่าฉันควรใช้ tcpdump -ne | ./mac_ip.py มีวิธีใดบ้างที่จะนำโปรแกรมของฉันกลับคืนมา อย่างไรก็ตามฉันสามารถเขียนโปรแกรมของฉันอีกครั้ง แต่ถ้ามันเกิดขึ้นอีกครั้งด้วยโปรแกรมที่สำคัญกว่าฉันควรจะทำอะไรบางอย่าง หรือมีวิธีใดที่จะบอกการเปลี่ยนเส้นทางเอาต์พุตเพื่อตรวจสอบไฟล์และเตือนว่าไฟล์นั้นรันได้หรือไม่?

2
น้อยกว่า file1 file2 | แมว - ทำไมจึงใช้งานได้
เมื่อฉันใช้less file1 file2ฉันจะได้รับทั้งไฟล์ที่แสดงใน "less buffer viewer" แต่less file1 file2 | catพิมพ์เนื้อหาของไฟล์ทั้งสองต่อท้าย stdout จะทราบได้อย่างไรว่าควรแสดง "โปรแกรมดูบัฟเฟอร์น้อย" หรือสร้างเอาต์พุตไปยัง stdout สำหรับคำสั่งถัดไป มีกลไกอะไรที่ใช้ในการทำสิ่งนี้?
21 pipe  cat  less 

4
เป็นไปได้ไหมที่จะเปลี่ยนทิศทางเอาต์พุตของคำสั่งไปเป็นคำสั่งมากกว่าหนึ่งคำสั่ง?
เท่าที่ฉันรู้ฉันสามารถใช้คำสั่ง tee เพื่อแยกเอาต์พุตมาตรฐานลงบนหน้าจอและไฟล์เพิ่มเติม: command -option1 -option2 argument | tee file1 file2 file3 เป็นไปได้หรือไม่ที่จะเปลี่ยนเส้นทางเอาต์พุตไปยังคำสั่งแทนที่จะเป็นไฟล์โดยใช้ tee ดังนั้นฉันสามารถสร้างเชนของคำสั่งได้ตามทฤษฎีหรือไม่
21 command-line  pipe  tee 

3
ไม่มีเอาต์พุตสีน้อยกว่าสำหรับคำสั่ง ls
ถ้าฉันรันlsฉันจะได้เอาต์พุตสีซึ่งฉันคิดว่ามันค่อนข้างสะดวกในการดูไฟล์ประเภทต่างๆ เมื่อฉันพยายามที่จะไปป์กับlessแม้กระทั่ง-rและตั้ง-Rค่าสถานะสีที่หายไปเสมอ ฉันใช้zshเวอร์ชั่น 5.0.7 ความคิดใด ๆ ขอบคุณ แก้ไข: ฉันอยู่บน OS X
21 osx  pipe  ls  colors  less 

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