จะเข้าใจคำสั่ง“ cat> file_name << blah” ได้อย่างไร?


13

ในคำสั่งต่อไป cat ใช้เนื้อหาของ here-doc และเปลี่ยนเส้นทางไปยังไฟล์ conf:

cat > conf << EOF
var1="cat"
var2="dog"
var3="hamster"
EOF

จะเข้าใจลำดับของคำสั่งได้อย่างไร bashขั้นตอนแรกจะประมวลผลทุกอย่าง (ที่นี่ส่วน doc) และเป็นขั้นตอนสุดท้ายมันดู> confส่วนหรือไม่

คำตอบ:


17

Here-Documentคือการเปลี่ยนเส้นทางของเชลล์ดังนั้นเชลล์จะดำเนินการเปลี่ยนเส้นทางตามปกติตั้งแต่ต้นจนจบ (หรือจากซ้ายไปขวาหรือลำดับการปรากฏ) สิ่งนี้ถูกกำหนดโดย POSIX:

หากระบุโอเปอเรเตอร์การเปลี่ยนเส้นทางมากกว่าหนึ่งรายการด้วยคำสั่งลำดับของการประเมินจะเริ่มตั้งแต่ต้นจนจบ


ในคำสั่งของคุณcatจะดำเนินการ> confครั้งแรกที่เปิดกว้างและตัดไฟล์สำหรับการเขียนแล้วอ่านข้อมูลจากconfHere-Document

ใช้straceคุณสามารถตรวจสอบได้:

$ strace -f -e trace=open,dup2 sh -c 'cat > conf << EOF
var1="cat"
var2="dog"
var3="hamster"
EOF
'
...
open("conf", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 3
dup2(3, 1)                              = 1
dup2(3, 0)                              = 0
...

ฉันเห็น. ดังนั้นโดยทั่วไปสิ่งที่เกิดขึ้นในกรณีของcat > file_name << blahคือก่อนที่จะดำเนินcatการstdoutของเปลือกเชื่อมต่อกับไฟล์ชื่อfile_nameแล้วstdinของเชลล์เชื่อมต่อกับhere-doc ?
มาร์ติน

@ มาร์ติน: ใช่ ท่านสามารถเข้าดูได้รับการเรียกก่อนopen dup2
cuonglm

12

เรามาดูกันดีกว่า:

unset file
cat >"$file" <<EOF
this is not in ${file=./myfile}
EOF

bash: : No such file or directory

แดง ฉันเดาว่ามันจะต้องทำ>"$file"ส่วนนั้นก่อน แต่ถ้าเป็น ...

unset file
<<EOF cat >"$file"
this is in ${file=./myfile}
EOF

... ไม่มีข้อผิดพลาด ... ?

cat ./myfile

this is in ./myfile

ตามที่ปรากฏคำสั่งมีความสำคัญ


-1

เมื่อbashสร้างกระบวนการที่จะรันcatมันจะเปิดขึ้นconfเพื่อเขียนบน file descriptor 1 และเปิดไฟล์ชั่วคราว (สำหรับ here-document) สำหรับอ่านบน file descriptor 0 ก่อนที่จะexecเข้าโปรแกรม ในกรณีนี้มันไม่สำคัญว่าการกระทำเหล่านั้นจะเกิดขึ้นจริง ๆ

2>&1การสั่งซื้อไม่กลายเป็นอย่างมีนัยสำคัญเมื่ออธิบายไฟล์จะมีพระราชเสาวนีย์เช่นกับ

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