ฟีดคำสั่งซอร์สพร้อมไพพ์


25

ก่อนหน้านี้ฉันใช้sourceคำสั่งแบบนี้:

source file_name

แต่สิ่งที่ฉันพยายามทำคือ:

echo something | source

ซึ่งไม่ได้ผล

คำตอบ:


38

เนื่องจากsource(หรือ.) ใช้ไฟล์เป็นอาร์กิวเมนต์คุณสามารถลอง:

source <(echo something)

1
ได้ผลดีขอบคุณ และสุขสันต์วันปีใหม่!
Desmond Hume

@muru นี้ใช้งานได้ดี โปรดทราบว่า "| source / dev / stdin" มีลักษณะของการทำงาน แต่จริง ๆ แล้วจะปล่อยการกำหนดตัวแปรทั้งหมด ไม่แน่ใจว่าทำไม ดูเหมือนจะมั่นคงในทางทฤษฎี มันบ้า
ดัสติน Oprea

2
@DustinOprea ไพพ์สร้างเชลล์ย่อยดังนั้นการกำหนดตัวแปรเหล่านั้นทั้งหมดจะไม่ส่งผลกระทบกับพาเรนต์เชลล์
muru

8

คำสั่งซอร์สของคุณต้องการอาร์กิวเมนต์ไฟล์ คุณสามารถหาได้ในเชลล์บางเชลล์ที่มีการทดแทนโปรเซสและนี่เป็นเพราะในทำนองเดียวกันเชลล์แทนที่ ...

arg=$(echo hi)

... echoบิตที่นั่นบนบรรทัดคำสั่งด้วยผลลัพธ์ของ subshell ในกรณีของการทดแทนกระบวนการมันแทนที่ subshell ด้วยไฟล์ชื่อ - ปกติ/dev/fd/62หรือบางสิ่งบางอย่าง - บางลิงค์ไปยัง file-descriptor ด้วยไพพ์ descriptor ของไฟล์คือ 0 ดังนั้น ...

echo 'echo hi' | . /dev/fd/0

... /dev/stdinหรืออะไรก็ตามแล้วแต่กรณีควรจะใช้งานได้ดีบนระบบลินุกซ์ - และอื่น ๆ อีกมากมาย คุณยังสามารถใช้เอกสารที่นี่ในทำนองเดียวกัน:

. /dev/fd/3 3<<HI
$(echo 'echo hi')
HI

คุณสามารถตรวจสอบวิธีที่เชลล์ของคุณจัดการกับการทดแทนกระบวนการโดยวิธี:

(set -x; readlink <(:))

... ที่พิมพ์(ในbash) :

+ set +x
+ readlink /dev/fd/63
++ :
pipe:[2212581]

... และเราจะเห็นได้ว่าเชลล์ทำการทดแทนและreadlinkกำลังอ่านจากไพพ์ anoymous ที่มันเปิดใน file-descriptor 63

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