เป็นไปได้ที่จะใช้เอกสารที่นี่หลายรายการในทุบตี?


14

หนึ่งสามารถใช้ที่นี่หลายเอกสารเพื่อให้ข้อมูลกับคำสั่งในทุบตี?

$ cat <<<foo <<<bar
bar
$ cat <<EOF1 <<EOF2
> foo
> EOF1
> bar
> EOF2
bar

เห็นได้ชัดว่าในทั้งสองกรณีเอกสาร here-doc ที่สองถูกใช้เป็น stdin และแทนที่การอ้างอิงแรก เป็นวิธีการใช้งานechoของแทนหรือไม่?

$ cat <(echo -n foo) <(echo bar)
foobar

นอกจากนี้ด้วยเหตุผลบางอย่างการใช้ชุดค่าผสมไม่ได้ผลสำหรับฉัน ทำไมถึงเป็นเช่นนั้น?

$ cat <<<foo <(echo bar)
bar
$ cat <(echo -n foo) <<<bar
foo

มีเหตุผลใดที่อยู่เบื้องหลังความจริงที่ว่าคุณต้องการใช้เอกสารสองฉบับที่นี่แทนที่จะรวมเข้าเป็นหนึ่งเดียว?
ถั่ว

1
@beans จริง ๆ แล้วฉันพบมันเมื่อทำการทดสอบpasteด้วยอินพุตแบบจำลอง ฉันคิดว่าฉันสามารถคิดสถานการณ์อื่น ๆ ไม่กี่ หากฉันมีสคริปต์ที่มีข้อความที่ควบคุมไว้ล่วงหน้าในตัวแปรบางตัวฉันอาจต้องการทำบางสิ่งบางอย่างกับทั้งสองโดยใช้คำสั่งที่รับเฉพาะไฟล์diffเท่านั้น
Sparhawk

อีกกรณีการใช้งาน (ฉันพบนี้โดยใช้เอกสารที่นี่เพื่อสร้างสคริปต์เปลือก): cat <<EOF1 <<"EOF2"คุณต้องการไม่กี่บรรทัดกับการขยายตัวตัวแปรแล้วเส้นบางโดยไม่ต้อง:
Toby Speight

คำตอบ:


18

คุณทำได้:

cat /dev/fd/3 3<< E1 /dev/fd/4 4<< E2
foo
E1
bar
E2

สามารถมีได้เพียงหนึ่ง stdin เท่านั้นเนื่องจากมี descriptor ไฟล์เพียงหนึ่งตัวเท่านั้น

cat << EOF
eof
EOF

สั้นสำหรับ:

cat /dev/fd/0 0<< EOF
eof
EOF

และ:

cat <<< foo

คือ:

cat /dev/fd/0 0<<< foo

คุณต้องตัดสินใจว่าจะเปิดไฟล์ descriptor 0

cat <(echo foo)

คือ:

cat /dev/fd/123

โดย123ที่ file descriptor ไปที่ไพพ์และในแบบคู่ขนาน bash จะทำงานecho fooในกระบวนการอื่นโดย stdout จะถูกเปลี่ยนเส้นทางไปยังปลายอีกด้านหนึ่งของไพพ์

เมื่อคุณผ่านชื่อไฟล์ให้cat, catไม่อ่านจาก stdin คุณต้องการ:

cat <(echo foo) /dev/fd/0 << EOF
bar
EOF

หรือ:

cat <(echo foo) - << EOF
bar
EOF

( -คือการบอกcatให้อ่านจาก stdin)


1
cat <<EOFไม่เหมือนกับcat /dev/fd/0...: ในกรณีหลังcatจะเห็นชื่อไฟล์และเปิดอยู่
Mikel

@Mikel สิ่งที่ฉันหมายก็คือว่ามันทำงานได้เทียบเท่า เมื่อไม่ผ่านการโต้แย้งใด ๆcatอ่านจากfd0 ราวกับว่าผ่านการโต้แย้งของ-หรือ/dev/fd/0(แม้ว่าบน Linux (และ Linux เท่านั้น) การเปิด/dev/fd/0ไม่เหมือนกับการทำซ้ำ file descriptor 0)
Stéphane Chazelas

ฉันรู้สึกประหลาดใจมากจากการ/dev/fd/3 3<< E1สร้างและฉันสงสัยว่าตอนนี้อะไรคือรายการภายใต้ / dev / fd / ฉันแม้ว่าพวกเขาจะปรากฏขลังหลังจากกระบวนการเปิดไฟล์บางแห่งในระบบไฟล์ยกเว้น 1 และ 2 ซึ่งมีค่าเริ่มต้นสำหรับทุกกระบวนการ แต่ในตัวอย่างของคุณคุณกำลังใช้ไฟล์ descriptor 3 และ 4 ที่ไม่ได้เชื่อมต่อกับไฟล์จริงยกเว้นการเปลี่ยนเส้นทางอินพุตนั้น ฉันไม่สามารถเข้าใจว่าในรูปแบบจิตของฉันอธิบายไฟล์ จะเกิดอะไรขึ้นถ้ากระบวนการต้องการเปิดไฟล์อื่นจะรู้ได้หรือไม่ว่าต้องใช้ fd 5? fds ต้องมี 3, 4, 5 .. หรือสามารถเป็นอะไรก็ได้
calavera.info

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