มีหลายวิธีในการทำเช่นนี้ วิธีที่ง่ายที่สุดน่าจะเป็น:
cat <<EOF | sh
touch somefile
echo foo > somefile
EOF
อื่นซึ่งเป็นไวยากรณ์ที่ดีกว่าในความคิดของฉัน:
(
cat <<EOF
touch somefile
echo foo > somefile
EOF
) | sh
สิ่งนี้ทำงานได้ดี แต่ไม่มีเชลล์ย่อย:
{
cat <<EOF
touch somefile
echo foo > somefile
EOF
} | sh
รูปแบบเพิ่มเติม:
cat <<EOF |
touch somefile
echo foo > somefile
EOF
sh
หรือ:
{ cat | sh; } << EOF
touch somefile
echo foo > somefile
EOF
อย่างไรก็ตามฉันคาดหวังว่าการใช้cat
คำถามของคุณจะเป็นตัวยึดตำแหน่งสำหรับสิ่งอื่น ถ้าไม่นำออกมาเช่นนี้
sh <<EOF
touch somefile
echo foo > somefile
EOF
ซึ่งอาจทำให้สิ่งนี้ง่ายขึ้น:
sh -c 'touch somefile; echo foo > somefile'
หรือ:
sh -c 'touch somefile
echo foo > somefile'
การเปลี่ยนเส้นทางเอาต์พุตแทนการไพพ์
sh >out <<EOF
touch somefile
echo foo > somefile
EOF
ใช้cat
เพื่อรับค่าเทียบเท่าecho test > out
:
cat >out <<EOF
test
EOF
เอกสารที่นี่หลาย
( cat; echo ---; cat <&3 ) <<EOF 3<<EOF2
hi
EOF
there
EOF2
สิ่งนี้สร้างผลลัพธ์:
hi
---
there
นี่คือสิ่งที่เกิดขึ้น:
- เชลล์จะเห็น
( ... )
และเรียกใช้คำสั่งที่ล้อมรอบในเชลล์ย่อย
- แมวและเสียงสะท้อนนั้นเรียบง่ายพอ
cat <&3
กล่าวว่าการเรียกใช้แมวกับไฟล์อธิบาย (FD) 0 (stdin) เปลี่ยนเส้นทางจาก FD 3; กล่าวอีกนัยหนึ่งให้ป้อนค่าจาก fd 3
- ก่อนที่
(...)
จะเริ่มเชลล์จะเห็นเอกสารทั้งสองที่นี่เปลี่ยนเส้นทางและทดแทน fd 0 ( <<EOF
) และ fd 3 ( 3<<EOF2
) ด้วย read-side ของไปป์
- เมื่อคำสั่งเริ่มต้นเริ่มขึ้นเชลล์อ่าน stdin จนกว่า EOF จะมาถึงและส่งไปยังด้านการเขียนของไพพ์แรก
- ถัดไปก็ทำเช่นเดียวกันกับ EOF2 และด้านเขียนของไพพ์ที่สอง
touch
จะมีอะไรที่คุณต้องการ? เป็นแค่อ่านไฟล์อินพุตและเปลี่ยนเส้นทางไปยังอีกด้วย stdout?