ใน POSIX เชลล์.
เป็นบิวด์อินพิเศษดังนั้นความล้มเหลวทำให้เชลล์ออก (ในบางเชลล์เช่นbash
มันทำเฉพาะเมื่ออยู่ในโหมด POSIX)
สิ่งที่มีคุณสมบัติเป็นข้อผิดพลาดขึ้นอยู่กับเปลือก ไม่ใช่ทั้งหมดที่ออกจากข้อผิดพลาดทางไวยากรณ์เมื่อแยกไฟล์ แต่ส่วนใหญ่จะออกเมื่อไม่สามารถค้นหาหรือเปิดไฟล์ที่มา ฉันไม่ทราบว่าสิ่งใดที่จะออกหากคำสั่งสุดท้ายในไฟล์ที่มากลับมาพร้อมกับสถานะออกไม่เป็นศูนย์ (เว้นแต่errexit
ตัวเลือกที่อยู่ในหลักสูตร)
ทำที่นี่:
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
เป็นกรณีที่คุณต้องการแหล่งที่มาของไฟล์ถ้ามันมีและไม่ถ้ามันไม่ได้ (หรือว่างเปล่าที่นี่ด้วย-s
)
นั่นคือไม่ควรพิจารณาข้อผิดพลาด (ข้อผิดพลาดร้ายแรงในเปลือก POSIX) หากไฟล์ไม่อยู่ที่นั่นไฟล์นั้นจะถือว่าเป็นไฟล์เสริม
จะยังคงเป็นข้อผิดพลาด (ร้ายแรง) หากไฟล์ไม่สามารถอ่านได้หรือเป็นไดเรกทอรีหรือ (ในบางเชลล์) หากมีข้อผิดพลาดทางไวยากรณ์ขณะแยกวิเคราะห์ซึ่งจะเป็นเงื่อนไขข้อผิดพลาดจริงที่ควรรายงาน
บางคนอาจโต้แย้งว่ามีสภาพการแข่งขัน แต่สิ่งเดียวที่หมายความว่าเชลล์จะออกโดยมีข้อผิดพลาดหากไฟล์ถูกลบระหว่าง[
และ.
แต่ฉันขอยืนยันว่ามันถูกต้องที่จะพิจารณาว่าเป็นข้อผิดพลาดที่ไฟล์พา ธ คงที่นี้จะหายไปทันทีในขณะที่สคริปต์เป็น วิ่ง.
ในทางกลับกัน,
command . "$NVM_DIR/nvm.sh" 2> /dev/null
โดยที่command
¹ลบคุณลักษณะพิเศษไปยัง.
คำสั่ง (ดังนั้นจึงไม่ออกจากเชลล์ด้วยข้อผิดพลาด) จะไม่ทำงานเป็น:
- มันจะซ่อน
.
ข้อผิดพลาด แต่ยังข้อผิดพลาดของคำสั่งทำงานในไฟล์ที่มา
- มันจะซ่อนเงื่อนไขข้อผิดพลาดจริงเช่นไฟล์ที่มีสิทธิ์ผิด
ไวยากรณ์ทั่วไปอื่น ๆ (ดูอินสแตนซ์ของgrep -r /etc/default /etc/init*
ระบบ Debian สำหรับสคริปต์ init ที่ยังไม่ได้แปลงเป็นsystemd
(ซึ่งEnvironmentFile=-/etc/default/service
จะใช้เพื่อระบุไฟล์สภาพแวดล้อมเพิ่มเติม)) รวมถึง:
[ -e "$file" ] && . "$file"
ตรวจสอบไฟล์ที่มีอยู่ยังคงแหล่งที่มาถ้ามันว่างเปล่า ยังคงมีข้อผิดพลาดร้ายแรงหากไม่สามารถเปิดได้ (แม้ว่าจะอยู่ที่นั่นหรืออยู่ที่นั่น) คุณอาจเห็นตัวแปรเพิ่มเติมเช่น[ -f "$file" ]
(มีอยู่และเป็นไฟล์ปกติ ), [ -r "$file" ]
(อ่านได้) หรือรวมกัน
[ ! -e "$file" ] || . "$file"
รุ่นที่ดีขึ้นเล็กน้อย ทำให้ชัดเจนว่าไฟล์ที่ไม่ได้มีอยู่เป็นเคส นั่นหมายถึงการที่$?
จะแสดงสถานะการออกของคำสั่งสุดท้ายที่ทำงานใน$file
(ในกรณีก่อนหน้าหากคุณได้รับ1
คุณไม่ทราบว่าเป็นเพราะ$file
ไม่มีอยู่หรือหากคำสั่งนั้นล้มเหลว)
command . "$file"
คาดว่าไฟล์จะอยู่ที่นั่น แต่จะไม่ออกหากไม่สามารถตีความได้
[ ! -e "$file" ] || command . "$file"
การรวมกันของด้านบน: มันก็โอเคถ้าไฟล์ไม่อยู่ที่นั่นและสำหรับ POSIX shells, ความล้มเหลวในการเปิด (หรือแยกวิเคราะห์) ไฟล์ถูกรายงาน แต่ไม่ร้ายแรง (ซึ่งอาจเป็นที่ต้องการมากกว่า~/.profile
)
¹หมายเหตุ: zsh
อย่างไรก็ตามคุณไม่สามารถใช้command
เช่นนั้นได้เว้นแต่จะsh
จำลอง โปรดทราบว่าในเปลือก Korn source
เป็นนามแฝงcommand .
ที่ไม่ใช่ตัวแปรพิเศษของ.