ก่อนหน้านี้ฉันใช้source
คำสั่งแบบนี้:
source file_name
แต่สิ่งที่ฉันพยายามทำคือ:
echo something | source
ซึ่งไม่ได้ผล
ก่อนหน้านี้ฉันใช้source
คำสั่งแบบนี้:
source file_name
แต่สิ่งที่ฉันพยายามทำคือ:
echo something | source
ซึ่งไม่ได้ผล
คำตอบ:
เนื่องจากsource
(หรือ.
) ใช้ไฟล์เป็นอาร์กิวเมนต์คุณสามารถลอง:
source <(echo something)
คำสั่งซอร์สของคุณต้องการอาร์กิวเมนต์ไฟล์ คุณสามารถหาได้ในเชลล์บางเชลล์ที่มีการทดแทนโปรเซสและนี่เป็นเพราะในทำนองเดียวกันเชลล์แทนที่ ...
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