คำถามติดแท็ก process-substitution

การทดแทนกระบวนการรูปแบบของการสื่อสารระหว่างกระบวนการที่อนุญาตให้อินพุตหรือเอาต์พุตของคำสั่งปรากฏเป็นไฟล์ (เช่น: `<(cmd)` หรือ `> (cmd)`)

5
กระบวนการทดแทนและท่อ
ฉันสงสัยว่าจะเข้าใจสิ่งต่อไปนี้อย่างไร: การวาง stdout ของคำสั่งลงใน stdin ของอีกอันเป็นเทคนิคที่ทรงพลัง แต่ถ้าคุณต้องการไพพ์ stdout ของหลายคำสั่งล่ะ? นี่คือที่มาทดแทนกระบวนการ กล่าวอีกนัยหนึ่งกระบวนการทดแทนสามารถทำสิ่งที่ท่อสามารถทำได้หรือไม่ กระบวนการทดแทนสามารถทำอะไรได้บ้าง แต่ไปป์ไม่ได้

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;()มันจะแสดงเนื้อหาไดเรกทอรี เกิดอะไรขึ้นในกรณีของไปป์ที่ระบุชื่อ?

2
ทำไม `sort <(ls -l)` ทำงาน แต่ `sort <(ls -l)` ล้มเหลว?
วันนี้ผมกำลังเรียนรู้อะไรบางอย่างเกี่ยวกับ FIFO บทความนี้: รู้เบื้องต้นเกี่ยวกับไปป์cat &lt;(ls -l)ซึ่งกล่าวถึง ฉันทำการทดลองโดยใช้sort &lt; (ls -l)ซึ่งข้อผิดพลาดปรากฏขึ้น: -bash: syntax error near unexpected token `('` จากนั้นฉันก็พบว่าฉันมีช่องว่างเพิ่มเติมในคำสั่งผิด แต่ทำไมคำสั่งพิเศษนี้จะนำไปสู่ความล้มเหลวนี้ ทำไมสัญลักษณ์การเปลี่ยนเส้นทางจะต้องใกล้เคียงกับ(?

1
เหตุใดการแทนที่กระบวนการ BASH จึงไม่ทำงานกับคำสั่งบางอย่าง
ในบางโอกาสการทดแทนกระบวนการจะไม่ทำงานตามที่คาดไว้ นี่คือตัวอย่าง: การป้อนข้อมูล: gcc &lt;(echo 'int main(){return 0;}') เอาท์พุท: /dev/fd/63: file not recognized: Illegal seek collect2: error: ld returned 1 exit status การป้อนข้อมูล: แต่มันทำงานได้อย่างที่คาดไว้เมื่อใช้กับคำสั่งอื่น: grep main &lt;(echo 'int main(){return 0;}') เอาท์พุท: int main(){return 0;} ฉันได้สังเกตเห็นความล้มเหลวที่คล้ายกันกับคำสั่งอื่น ๆ (เช่นคำสั่งคาดหวังว่าไฟล์จากการทดแทนกระบวนการไม่สามารถใช้/dev/fd/63หรือคล้ายกัน) ความล้มเหลวด้วยgccนี้เป็นเพียงล่าสุด มีกฎทั่วไปบางอย่างที่ฉันควรทราบเพื่อกำหนดว่าเมื่อใดการทดแทนกระบวนการจะล้มเหลวด้วยวิธีนี้และไม่ควรใช้? ฉันใช้ BASH รุ่นนี้บน Ubuntu 12.04 (ฉันเคยเห็นใน arch และ debian): GNU bash, …

2
วิธีการพกพา (POSIX) เพื่อให้เกิดการทดแทนกระบวนการคืออะไร?
เชลล์บางตัวbashสนับสนุนการทดแทนกระบวนการซึ่งเป็นวิธีการนำเสนอผลลัพธ์กระบวนการเป็นไฟล์เช่นนี้: $ diff &lt;(sort file1) &lt;(sort file2) อย่างไรก็ตามโครงสร้างนี้ไม่ใช่POSIXและไม่ใช่พกพา วิธีสามารถดำเนินการเปลี่ยนตัวทำได้ในPOSIXลักษณะที่เป็นมิตร (เช่นหนึ่งซึ่งทำงาน/bin/sh) ? หมายเหตุ: คำถามไม่ได้ถามว่าจะแตกไฟล์ที่จัดเรียงสองไฟล์ได้อย่างไรซึ่งเป็นเพียงตัวอย่างที่ประดิษฐ์ขึ้นเพื่อสาธิตการทดแทนกระบวนการ !

4
bash: วิธีการเผยแพร่ข้อผิดพลาดในการทดแทนกระบวนการ?
ฉันต้องการเชลล์สคริปต์ของฉันล้มเหลวเมื่อใดก็ตามที่คำสั่งดำเนินการกับพวกเขาล้มเหลว โดยทั่วไปแล้วฉันจะทำกับ: set -e set -o pipefail (ฉันมักจะเพิ่มset -uด้วย) สิ่งนี้คือไม่มีสิ่งใดในข้างต้นที่ใช้ได้กับการทดแทนกระบวนการ รหัสนี้พิมพ์ว่า "ok" และออกโดยมีรหัสส่งคืน = 0 ในขณะที่ฉันต้องการมันล้มเหลว: #!/bin/bash -e set -o pipefail cat &lt;(false) &lt;(echo ok) มีอะไรที่เทียบเท่ากับ "pipefail" แต่สำหรับการทดแทนกระบวนการ? วิธีอื่นใดในการส่งผ่านคำสั่งเอาต์พุตของคำสั่งเหมือนกับเป็นไฟล์ แต่การเพิ่มข้อผิดพลาดเมื่อใดก็ตามที่โปรแกรมเหล่านั้นล้มเหลว? วิธีแก้ไขปัญหาของคนจนจะตรวจพบว่าคำสั่งเหล่านั้นเขียนไปยัง stderr (แต่บางคำสั่งเขียนไปยัง stderr ในสถานการณ์ที่ประสบความสำเร็จ) อีกโซลูชันที่สอดคล้องกับ posix จะใช้ชื่อ pipes แต่ฉันจำเป็นต้อง lauch คำสั่งเหล่านั้น - ใช้ - กระบวนการแทน - เป็น oneliners สร้างขึ้นทันทีจากรหัสรวบรวมและสร้างไปป์ชื่อจะซับซ้อนสิ่ง …

1
ใน zsh ความแตกต่างระหว่าง cat <(cat) กับ cat | cat vs cat = (cat)?
ฉันคาดหวังcat &lt;(cat)และcat | catทำสิ่งเดียวกัน: คัดลอกบรรทัดจาก stdin ไปยัง stdout ความเข้าใจของฉันคือการที่ทั้งสองจะดำเนินการcatใน subshell การเปลี่ยนเส้นทาง subshell cat's stdout เพื่อไปป์ที่มีชื่อชั่วคราวและจากนั้นดำเนินการอื่นcatในเปลือกปัจจุบันกับ stdin มันเปลี่ยนเส้นทางไปยังท่อ แต่cat &lt;(cat)ช่วยให้ฉันพิมพ์ที่ terminal ของฉัน แต่ไม่มีเส้นที่นำเข้าได้รับการคัดลอกและ^Dล้มเหลวในการส่งสัญญาณEOF; cat | catทำงานได้ตามที่คาดหวัง จากการทดสอบเพิ่มเติมฉันได้ตรวจสอบว่าcat =(cat)มีปัญหาคล้ายกันcat &lt;(cat)แต่ใช้งานได้ตามที่คาดไว้: stdin ทั้งหมดไปจนถึงการ^Dคัดลอกไปยัง stdout ในครั้งเดียว ใครสามารถช่วยฉันเข้าใจสิ่งที่ zsh กำลังทำอยู่ภายใต้ประทุน?

4
วิธีเลียนแบบการทดแทนกระบวนการใน Dash ได้อย่างไร
ในbashฉันสามารถใช้การทดแทนกระบวนการและปฏิบัติต่อผลลัพธ์ของกระบวนการราวกับว่ามันเป็นไฟล์ที่บันทึกไว้ในดิสก์: $ echo &lt;(ls) /dev/fd/63 $ ls -lAhF &lt;(ls) lr-x------ 1 root root 64 Sep 17 12:55 /dev/fd/63 -&gt; pipe:[1652825] dashน่าเสียดายที่กระบวนการชดเชยไม่ได้รับการสนับสนุนใน อะไรจะเป็นวิธีที่ดีที่สุดที่จะเลียนแบบได้อย่างรวดเร็วProcess Substitution? ฉันไม่ต้องการบันทึกผลลัพธ์เป็นไฟล์ชั่วคราวที่ไหนสักแห่ง ( /tmp/) แล้วต้องลบมันออก มีวิธีอื่นไหม?

2
เอาท์พุทการทดแทนกระบวนการออกคำสั่ง
echo one; echo two &gt; &gt;(cat); echo three; คำสั่งให้ผลลัพธ์ที่ไม่คาดคิด ฉันอ่านสิ่งนี้: วิธีการใช้กระบวนการทดแทนในทุบตีอย่างไร และบทความอื่น ๆ อีกมากมายเกี่ยวกับการทดแทนกระบวนการบนอินเทอร์เน็ต แต่ไม่เข้าใจว่าทำไมจึงมีพฤติกรรมเช่นนี้ ผลลัพธ์ที่คาดหวัง: one two three ผลผลิตจริง: prompt$ echo one; echo two &gt; &gt;(cat); echo three; one three prompt$ two ทั้งสองคำสั่งนี้ควรจะเทียบเท่ากับมุมมองของฉัน แต่พวกเขาไม่ได้: ##### first command - the pipe is used. prompt$ seq 1 5 | cat 1 …

5
ไฟล์ grep จากรายการ
ฉันกำลังพยายามเรียกใช้ grep กับรายการของไฟล์สองสามร้อย: $ head -n 3 &lt;(cat files.txt) admin.php ajax/accept.php ajax/add_note.php อย่างไรก็ตามแม้ว่าฉันกำลังค้นหาสตริงที่ฉันรู้ว่าพบในไฟล์ต่อไปนี้จะไม่ค้นหาไฟล์: $ grep -i 'foo' &lt;(cat files.txt) $ grep -i 'foo' admin.php The foo was found ฉันคุ้นเคยกับการ-fตั้งค่าสถานะซึ่งจะอ่านรูปแบบจากไฟล์ แต่จะอ่านไฟล์อินพุตได้อย่างไร? ฉันได้พิจารณาวิธีแก้ปัญหาที่น่ากลัวของการคัดลอกไฟล์ไปยังไดเรกทอรีชั่วคราวตามที่cpดูเหมือนว่าจะสนับสนุน&lt;(cat files.txt)รูปแบบและจากนั้นมีการ grepping ไฟล์ เชอร์ลี่ย์มีวิธีที่ดีกว่า

3
วิธีรวมกระบวนการทดแทนของ Bash เข้ากับเอกสาร HERE ได้อย่างไร
ใน Bash รุ่น 4.2.47 (1) - ปล่อยเมื่อฉันพยายามที่จะจัดรูปแบบข้อความที่จัดมาจาก HERE-dcoument ดังนี้: cat &lt;(fmt --width=10 &lt;&lt;FOOBAR (I want the surrounding parentheses to be part of the HERE-document) (Even the preceding unbalanced parenthesis should be part of it. FOOBAR ) # I want this paranthesis to end the process substitution. ฉันได้รับข้อผิดพลาดต่อไปนี้: bash: bad substitution: …

2
Bash: กระบวนการทดแทนและ stdin
บรรทัดต่อไปนี้ชัดเจน: echo "bla" | foo | bar แต่สิ่งที่อยู่ด้านล่างทำเช่นเดียวกันหรือไม่ echo "bla" | bar &lt;(foo) echo "bla" | bar &lt; &lt;(foo) ข้อใดfooและbarอ่าน "bla" จาก stdin และทำไม ฉันหมายความว่าแน่นอนฉันสามารถเขียนโค้ดและตรวจสอบ แต่ฉันไม่แน่ใจว่าเป็นพฤติกรรมที่กำหนดไว้หรือฉันใช้ประโยชน์จากคุณลักษณะที่ไม่ควรเชื่อถือ

4
ฉันจะจับรหัสทางออก / จัดการผิดได้อย่างถูกต้องเมื่อใช้การทดแทนกระบวนการได้อย่างไร
ฉันมีสคริปต์ที่แยกวิเคราะห์ชื่อไฟล์ลงในอาร์เรย์โดยใช้วิธีการต่อไปนี้ที่นำมาจากQ&amp;A บน SO : unset ARGS ARGID="1" while IFS= read -r -d $'\0' FILE; do ARGS[ARGID++]="$FILE" done &lt; &lt;(find "$@" -type f -name '*.txt' -print0) วิธีนี้ใช้งานได้ดีและจัดการรูปแบบชื่อไฟล์ทุกประเภทได้อย่างสมบูรณ์แบบ อย่างไรก็ตามบางครั้งฉันจะส่งไฟล์ที่ไม่มีอยู่ไปยังสคริปต์เช่น: $ findscript.sh existingfolder nonexistingfolder find: `nonexistingfile': No such file or directory ... ภายใต้สถานการณ์ปกติฉันจะให้สคริปต์จับรหัสออกด้วยสิ่งที่ชอบRET=$?และใช้เพื่อตัดสินใจว่าจะดำเนินการอย่างไร ดูเหมือนจะไม่ทำงานกับการทดแทนกระบวนการด้านบน ขั้นตอนที่ถูกต้องในกรณีเช่นนี้คืออะไร? ฉันจะจับรหัสส่งคืนได้อย่างไร มีวิธีอื่นที่เหมาะสมกว่าหรือไม่ในการพิจารณาว่ามีบางอย่างผิดพลาดในกระบวนการทดแทนหรือไม่

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 …

2
กระบวนการทดแทนถูกนำมาใช้ในการทุบตี?
ฉันกำลังค้นคว้าคำถามอื่นเมื่อฉันรู้ว่าฉันไม่เข้าใจว่าเกิดอะไรขึ้นภายใต้ประทุน/dev/fd/*ไฟล์เหล่านั้นคืออะไรและกระบวนการของเด็กสามารถเปิดได้อย่างไร

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