ใช่เชลล์bash
โดยเฉพาะอย่างยิ่งระมัดระวังในการอ่านไฟล์ทีละบรรทัดดังนั้นมันจะทำงานเหมือนกับเมื่อคุณใช้แบบโต้ตอบ
คุณจะสังเกตเห็นว่าเมื่อไฟล์ไม่สามารถค้นหาได้ (เช่นไพพ์) ให้bash
อ่านทีละหนึ่งไบต์เพื่อให้แน่ใจว่าจะไม่อ่าน\n
อักขระที่ผ่านมา เมื่อไฟล์ถูก seekable มันเพิ่มประสิทธิภาพโดยการอ่านบล็อกเต็มรูปแบบได้ตลอดเวลา \n
แต่ขอกลับไปหลังจากที่
นั่นหมายความว่าคุณสามารถทำสิ่งต่าง ๆ เช่น:
bash << \EOF
read var
var's content
echo "$var"
EOF
หรือเขียนสคริปต์ที่อัปเดตตัวเอง ซึ่งคุณจะไม่สามารถทำได้หากไม่ได้ให้การรับประกันแก่คุณ
ทีนี้มันเป็นเรื่องยากที่คุณต้องการทำสิ่งต่าง ๆ เช่นนั้นและตามที่คุณค้นพบคุณลักษณะนั้นมีแนวโน้มที่จะได้รับประโยชน์มากกว่าที่เป็นอยู่
เพื่อหลีกเลี่ยงคุณสามารถลองและตรวจสอบให้แน่ใจว่าคุณไม่ได้แก้ไขไฟล์ในสถานที่ (ตัวอย่างเช่นแก้ไขสำเนาและย้ายสำเนาในสถานที่ (เช่นsed -i
หรือperl -pi
และบรรณาธิการบางคนทำเช่น))
หรือคุณสามารถเขียนสคริปต์ของคุณเช่น:
{
sleep 20
echo test
}; exit
(โปรดทราบว่าเป็นสิ่งสำคัญที่exit
จะต้องอยู่ในบรรทัดเดียวกันกับ}
; แม้ว่าคุณสามารถใส่ไว้ในวงเล็บปีกกาก่อนที่จะปิดหนึ่ง)
หรือ:
main() {
sleep 20
echo test
}
main "$@"; exit
เชลล์จะต้องอ่านสคริปต์จนถึงexit
ก่อนที่จะเริ่มทำอะไร เพื่อให้แน่ใจว่าเชลล์จะไม่อ่านจากสคริปต์อีกครั้ง
นั่นหมายความว่าสคริปต์ทั้งหมดจะถูกเก็บไว้ในหน่วยความจำ
ที่สามารถส่งผลกระทบต่อการแยกวิเคราะห์สคริปต์
ตัวอย่างเช่นในbash
:
export LC_ALL=fr_FR.UTF-8
echo $'St\ue9phane'
จะส่งออกที่ U + 00E9 เข้ารหัสใน UTF-8 อย่างไรก็ตามหากคุณเปลี่ยนเป็น:
{
export LC_ALL=fr_FR.UTF-8
echo $'St\ue9phane'
}
\ue9
จะได้รับการขยายตัวใน charset ที่อยู่ในผลในเวลาที่ถูกคำสั่งแยกวิเคราะห์ซึ่งในกรณีนี้คือก่อนที่จะexport
คำสั่งจะถูกดำเนินการ
โปรดทราบด้วยว่าหากใช้คำสั่งsource
aka .
พร้อมกับเชลล์บางตัวคุณจะมีปัญหาแบบเดียวกันกับไฟล์ที่มา
นั่นไม่ใช่กรณีที่bash
แม้ว่าจะมีsource
คำสั่งอ่านแฟ้มอย่างเต็มที่ก่อนที่จะแปลความหมายของมัน หากเขียนbash
เฉพาะคุณสามารถใช้สิ่งนั้นได้โดยเพิ่มเมื่อเริ่มต้นสคริปต์:
if [[ ! $already_sourced ]]; then
already_sourced=1
source "$0"; exit
fi
(ฉันจะไม่พึ่งพาสิ่งนั้นแม้ว่าคุณจะจินตนาการได้ว่าเวอร์ชันในอนาคตของbash
สามารถเปลี่ยนพฤติกรรมที่สามารถมองเห็นได้ในปัจจุบันเป็นข้อ จำกัด (ทุบตีและ AT&T ksh เป็นเปลือกหอย POSIX เท่านั้นที่ทำงานเช่นนั้นเท่าที่จะบอก) และalready_sourced
กลอุบายนั้นค่อนข้างบอบบางเพราะถือว่าตัวแปรนั้นไม่ได้อยู่ในสภาพแวดล้อมไม่ต้องพูดถึงว่ามันส่งผลกระทบต่อเนื้อหาของตัวแปร BASH_SOURCE)