คำสั่งทดสอบ [ -t 1 ]
การตรวจสอบว่าการส่งออกทุบตีอยู่บนขั้ว เจตนาของบรรทัดนี้คือการรัน zsh อย่างชัดเจนเมื่อเปิดเทอร์มินัลโดยไม่รบกวนการใช้ bash อื่น ๆ แต่มันทำไม่ดีมาก
ไฟล์.bashrc
ถูกอ่านในสามสถานการณ์:
- เมื่อทุบตีจะดำเนินการเป็นเปลือกโต้ตอบคือการเรียกใช้คำสั่งที่พิมพ์โดยผู้ใช้มากกว่าที่จะดำเนินการคำสั่งชุด
- เมื่อ bash เป็นเชลล์ที่ไม่มีการโต้ตอบซึ่งดำเนินการโดย RSH หรือ SSH daemon (โดยทั่วไปจะเป็นเพราะคุณรัน
ssh host.example.com somecommand
และ bash คือเชลล์ล็อกอินของคุณhost.example.com
)
- เมื่อมีการเรียกใช้อย่างชัดเจนเช่นในผู้ใช้
.bash_profile
( การเลือกไฟล์เริ่มต้นของ bash ค่อนข้างแปลก )
[ -t 1 ]
เป็นวิธีที่ไม่ดีในการตรวจหาเชลล์แบบโต้ตอบ เป็นไปได้ แต่ยากที่จะรัน bash แบบโต้ตอบกับเอาต์พุตมาตรฐานไม่ไปที่เทอร์มินัล เป็นเรื่องปกติที่จะมีเอาต์พุตมาตรฐานไปยังเทอร์มินัลในเชลล์ที่ไม่มีการโต้ตอบ เชลล์ที่ไม่มีการโต้ตอบนั้นไม่มีธุรกิจที่ทำงานอยู่.bashrc
แต่น่าเสียดายที่ bash shell นั้นถูกเรียกใช้โดย SSH มีวิธีที่ดีกว่ามาก: ทุบตี (และเชลล์สไตล์ sh อื่น ๆ ) ให้วิธีการในตัวที่เชื่อถือได้ในการทำ
case $- in
*i*) echo this shell is interactive;;
*) echo this shell is not interactive;;
esac
ดังนั้นควร“ เขียน zsh ถ้านี่เป็นเชลล์แบบโต้ตอบ”
case $- in
*i*) exec zsh;;
esac
แต่นั่นไม่ใช่ความคิดที่ดี: มันป้องกันการเปิด bash shell ซึ่งมีประโยชน์แม้ว่าคุณจะใช้ zsh ลืมเกี่ยวกับการโพสต์บล็อกนี้และเพียงแค่กำหนดค่าทางลัดของคุณที่เปิด terminal เพื่อรัน zsh แทนการทุบตี อย่าจัดเรียงสิ่งต่าง ๆ ดังนั้น“ เมื่อใดก็ตามที่คุณเปิดแอปพลิเคชัน Bash บน Windows ตอนนี้มันจะเริ่มต้นด้วยเชลล์ Zsh”: เมื่อคุณต้องการ zsh ให้เปิดแอปพลิเคชัน Zsh
bash
สามารถอ่าน.bashrc
แม้ไม่ได้ แบบโต้ตอบ (เช่นเดียวกับssh host cmd
ที่bash
อยู่ในเปลือกเข้าสู่ระบบของผู้ใช้บนโฮสต์หรือbash --login -c 'some code'
ที่.bash_profile
แหล่งที่มา.bashrc
)case $- in *i*)...
เป็นวิธีที่ถูกต้องในการทดสอบว่าเชลล์มีการโต้ตอบหรือไม่