ฉันทราบดีถึงยูทิลิตี้source
(aka .
) ซึ่งจะนำเนื้อหาจากไฟล์และเรียกใช้งานภายในเชลล์ปัจจุบัน
ตอนนี้ฉันกำลังเปลี่ยนข้อความบางส่วนเป็นคำสั่งเชลล์แล้วเรียกใช้งานดังต่อไปนี้:
$ ls | sed ... | sh
ls
เป็นเพียงตัวอย่างแบบสุ่มข้อความต้นฉบับอาจเป็นอะไรก็ได้ sed
เช่นกันเป็นเพียงตัวอย่างสำหรับการแปลงข้อความ sh
บิตที่น่าสนใจคือ ฉันไปป์ทุกอย่างที่ฉันไปถึงsh
แล้วมันก็วิ่งไป
ปัญหาของฉันคือนั่นหมายถึงการเริ่มต้นเชลล์ย่อยใหม่ ฉันอยากให้คำสั่งทำงานภายในเชลล์ปัจจุบันของฉัน เช่นเดียวกับที่ฉันสามารถทำได้source some-file
ถ้าฉันมีคำสั่งในไฟล์ข้อความ
ฉันไม่ต้องการสร้างไฟล์ชั่วคราวเพราะรู้สึกว่าสกปรก
หรือฉันต้องการเริ่มเชลล์ย่อยของฉันด้วยลักษณะเดียวกับเชลล์ปัจจุบันของฉัน
อัพเดต
โอเควิธีแก้ปัญหาโดยใช้ backtick ใช้งานได้ดี แต่ฉันมักจะต้องทำสิ่งนี้ในขณะที่ฉันกำลังตรวจสอบและเปลี่ยนผลลัพธ์ดังนั้นฉันชอบมากถ้ามีวิธีที่จะทำให้ผลลัพธ์เป็นบางสิ่งในตอนท้าย
อัปเดตที่น่าเศร้า
อ่า/dev/stdin
สิ่งนี้ดูสวยมาก แต่ในกรณีที่ซับซ้อนกว่านั้นมันไม่ได้ผล
ฉันมีสิ่งนี้:
find . -type f -iname '*.doc' | ack -v '\.doc$' | perl -pe 's/^((.*)\.doc)$/git mv -f $1 $2.doc/i' | source /dev/stdin
ซึ่งทำให้มั่นใจได้ว่า.doc
ไฟล์ทั้งหมดจะมีส่วนขยายที่ลดลง
และสิ่งใดที่สามารถจัดการได้โดยบังเอิญxargs
แต่นั่นก็นอกเหนือจากประเด็น
find . -type f -iname '*.doc' | ack -v '\.doc$' | perl -pe 's/^((.*)\.doc)$/$1 $2.doc/i' | xargs -L1 git mv
ดังนั้นเมื่อฉันเรียกใช้อดีตมันจะออกทันทีไม่มีอะไรเกิดขึ้น