ฉันจะบอกได้อย่างไร (ใน~/.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"