ฉันจะบอกได้อย่างไร (ใน~/.bashrc
) ว่าฉันกำลังทำงานในโหมดอินเตอร์แอคทีฟหรือว่าดำเนินการคำสั่งผ่าน ssh ฉันต้องการหลีกเลี่ยงการพิมพ์ ANSI escape sequences ด้วย.bashrc
หากเป็นลำดับหลัง
ฉันจะบอกได้อย่างไร (ใน~/.bashrc
) ว่าฉันกำลังทำงานในโหมดอินเตอร์แอคทีฟหรือว่าดำเนินการคำสั่งผ่าน ssh ฉันต้องการหลีกเลี่ยงการพิมพ์ ANSI escape sequences ด้วย.bashrc
หากเป็นลำดับหลัง
คำตอบ:
ตามman bash
:
มีการตั้งค่า PS1 และ $ - รวม i หาก bash เป็นแบบโต้ตอบอนุญาตให้เชลล์สคริปต์หรือไฟล์เริ่มต้นเพื่อทดสอบสถานะนี้
ดังนั้นคุณสามารถใช้:
if [[ $- == *i* ]]
then
do_interactive_stuff
fi
นอกจากนี้:
เมื่อเชลล์เชิงโต้ตอบที่ไม่ใช่เชลล์ล็อกอินเริ่มทำงาน bash จะอ่านและดำเนินการคำสั่งจาก /etc/bash.bashrc และ ~ / .bashrc หากมีไฟล์เหล่านี้อยู่
ดังนั้นจึง~/.bashrc
มีที่มาสำหรับเชลล์แบบโต้ตอบเท่านั้น บางครั้งผู้คนก็มาจาก~/.bash_profile
หรือ~/.profile
ที่ไม่ถูกต้องเพราะมันรบกวนพฤติกรรมที่คาดหวัง หากคุณต้องการลดความยุ่งยากในการบำรุงรักษารหัสที่ใช้กันทั่วไปคุณควรใช้ไฟล์แยกต่างหากเพื่อเก็บรหัสทั่วไปและแหล่งที่มาของรหัสนั้นแยกต่างหากจากไฟล์ rc
เป็นการดีที่สุดถ้าไม่มีเอาต์พุตไปยัง stdout จากrc
ไฟล์ล็อกอินเช่น~/.bash_profile
หรือ~/.profile
เนื่องจากสามารถรบกวนการทำงานที่เหมาะสมของrsync
ตัวอย่าง
ในกรณีใด ๆ ก็ยังคงเป็นความคิดที่ดีในการทดสอบการโต้ตอบเนื่องจากการกำหนดค่าที่ไม่ถูกต้องอาจมีอยู่
[[ $- =~ i ]] && echo interactive
i
~/.bash_profile
หรือ~/.profile
ที่ไม่ถูกต้องเพราะมันรบกวนพฤติกรรมที่คาดหวังถูกต้อง คุณคิดอย่างไรกับการจัดหา~/.bashrc
จาก~/.bash_login
? ในฐานะที่เป็นเชลล์ล็อกอินไม่จำเป็นต้องเป็นแบบโต้ตอบฉันเดาว่ามันไม่ถูกต้องเช่นกัน
ใช้:
if tty -s; then echo interactive; fi
test
เครื่องมือที่สามารถตรวจสอบนี้ (จากหน้าคน):
-t FD True if FD is opened on a terminal.
ดังนั้นคุณสามารถใช้ตัวอย่างเช่น:
if [ -t 0 ] ; then
echo stdin is a terminal
.....
fi
หรือ
if [ -t 1 ] ; then
echo stdout is a terminal
fi
bash <<< 'test -t 0 && echo Y || echo X'
เขียนY
, bash -c 'test -t 0 && echo Y || echo X'
เขียนX
ฉันมักจะดูผลลัพธ์ของโปรแกรม tty
หากคุณอยู่บน tty มันจะบอกคุณว่าคุณอยู่บน tty หากคุณไม่ได้อยู่ในโหมดโต้ตอบก็มักจะบอกคุณบางอย่างเช่น "ไม่ใช่ tty"