[-t 1] ตรวจสอบอะไร


13

ฉันเพิ่งพบวิธีการเริ่มต้นzshเมื่อฉันเริ่มbashบน Windows จาก

https://www.howtogeek.com/258518/how-to-use-zsh-or-another-shell-in-windows-10/

.bashrcมันแนะนำให้เพิ่มรหัสต่อไปนี้ที่สุดท้าย

# Launch Zsh
if [ -t 1 ]; then
exec zsh
fi

อะไร[ -t 1 ]หมายถึง?

มันเป็นความจริงเหรอ?

จากนั้นฉันจะทำสิ่งนี้ได้ไหม?

exec zsh

คำตอบ:


14

[]เป็นทางลัดของtestคำสั่ง

ตามman test:

-t FD
จริงถ้า FD เป็นตัวอธิบายไฟล์ที่เชื่อมโยงกับเทอร์มินัล

ดังนั้นหากคุณรัน bash เป็นเชลล์แบบโต้ตอบ (เทอร์มินัล - ดูหัวข้อนี้สำหรับคำอธิบายคำศัพท์), bash จะถูกแทนที่ด้วย zsh

เพิ่มเติมเกี่ยวกับไฟล์. bash *:

เมื่อ bash ถูกเรียกใช้เป็นเชลล์ล็อกอินแบบโต้ตอบหรือเป็นเชลล์แบบ ไม่โต้ตอบที่มีตัวเลือก --loginมันจะอ่านและเรียกใช้คำสั่งจากไฟล์ / etc / profile ก่อนหากไฟล์นั้นมีอยู่ หลังจากอ่านไฟล์นั้นจะค้นหา ~ / .bash_profile, ~ / .bash_login และ ~ / .profile ตามลำดับและอ่านและเรียกใช้คำสั่งจากไฟล์แรกที่มีอยู่และอ่านได้ ตัวเลือก - noprofile อาจถูกใช้เมื่อเชลล์เริ่มต้นเพื่อยับยั้งพฤติกรรมนี้

เมื่อล็อกอินเชลล์ออก bash จะอ่านและดำเนินการคำสั่งจากไฟล์ ~ / .bash_logout และ /etc/bash.bash_logout หากไฟล์นั้นมีอยู่

เมื่อ เชลล์เชิงโต้ตอบที่ไม่ใช่เชลล์ล็อกอินเริ่มทำงาน bash จะอ่านและดำเนินการคำสั่งจาก~ / .bashrcหากไฟล์นั้นมีอยู่ สิ่งนี้อาจถูกยับยั้งโดยใช้ตัวเลือก --norc ตัวเลือกไฟล์ --rcfile จะบังคับให้ทุบตีเพื่ออ่านและดำเนินการคำสั่งจากไฟล์แทน ~ / .bashrc

Stéphane Chazelas ความคิดเห็น:
หมายเหตุว่าเปลือกสามารถโต้ตอบได้โดยไม่ต้อง stdout เป็นขั้วและเปลือกสามารถไม่โต้ตอบกับขั้วบน stdout (เช่นเวลาที่คุณเรียกใช้สคริปต์ภายในสถานีได้โดยไม่ต้องเปลี่ยนเส้นทาง / ท่อเอาท์พุท) และbashสามารถ อ่าน.bashrcแม้ว่าจะไม่ใช่แบบโต้ตอบ (เช่นในssh host cmdที่ซึ่งbashเชลล์ล็อกอินของผู้ใช้บนโฮสต์หรือbash --login -c 'some code') อยู่ที่ไหน case $- in *i*)...เป็นวิธีที่ถูกต้องในการทดสอบว่าเชลล์มีการโต้ตอบหรือไม่


4
โปรดทราบว่าเปลือกสามารถโต้ตอบได้โดยไม่ต้อง stdout เป็นขั้วและเปลือกสามารถไม่โต้ตอบกับขั้วบน stdout (เช่นเวลาที่คุณเรียกใช้สคริปต์ภายในสถานีได้โดยไม่ต้องเปลี่ยนเส้นทาง / ท่อเอาท์พุท) และbashสามารถอ่าน .bashrcแม้ไม่ได้ แบบโต้ตอบ (เช่นเดียวกับssh host cmdที่bashอยู่ในเปลือกเข้าสู่ระบบของผู้ใช้บนโฮสต์หรือbash --login -c 'some code'ที่.bash_profileแหล่งที่มา.bashrc) case $- in *i*)...เป็นวิธีที่ถูกต้องในการทดสอบว่าเชลล์มีการโต้ตอบหรือไม่
Stéphane Chazelas

@ StéphaneChazelasเป็นจุดที่ดี ฉันจะมีความคิดเห็นของคุณในคำตอบ
mrc02_kr

มีคำจำกัดความที่แตกต่างกันจำนวนหนึ่งของ "การโต้ตอบ" หากเชลล์คิดว่าเป็นแบบโต้ตอบiจะมีการตั้งค่า (และในเชลล์สมัยใหม่ที่สามารถทดสอบได้ifแทนที่จะต้องใช้case) แต่มีหลายกรณีที่มีการใช้งานเพียงกรณีเดียวที่สนใจหาก stdout (หรือ stdin หรือ stderr ... ) เชื่อมต่อกับเทอร์มินัล
Mark Reed

9

คำสั่งทดสอบ [ -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


สำหรับ rsh/ sshและสำหรับเชลล์เชิงโต้ตอบถ้าไม่ใช่เชลล์ล็อกอิน สำหรับเชลล์ล็อกอิน ( sshdจะไม่เริ่มเชลล์ล็อกอินที่ไม่ใช่แบบโต้ตอบ แต่คุณสามารถทำได้ด้วยssh host exec bash -l) .bash_profileอ่านแทน นอกจากนี้โปรดทราบว่าสำหรับrsh/ sshคุณต้อง$SHLVLยกเลิกการตั้งค่าหรือ 0
Stéphane Chazelas

5

ผู้ชาย 1 การทดสอบ :

-t FD

file descriptor FD ถูกเปิดบนเทอร์มินัล

ตัวอย่างของคุณดำเนินการ (แทนที่กระบวนการกำลังทำงานในกรณีนี้bash) ด้วยzshเปิดถ้าstdoutเปิดอยู่บนเทอร์มินัล (ไม่ใช่ไฟล์ / pipe / etc)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.