Der Testbefehl [ -t 1 ]
prüft, ob die Ausgabe der Bash auf einem Terminal ist. Die Absicht dieser Zeile ist eindeutig, zsh auszuführen, wenn ein Terminal geöffnet wird, ohne andere Verwendungen von bash zu stören. Aber es ist sehr schlecht gemacht.
Die Datei .bashrc
wird unter drei Umständen gelesen:
- Wenn bash als interaktive Shell ausgeführt wird, dh um vom Benutzer eingegebene Befehle auszuführen, anstatt Stapelbefehle auszuführen.
- Wenn bash eine nicht interaktive Shell ist, die von einem RSH- oder SSH-Daemon ausgeführt wird (normalerweise, weil Sie
ssh host.example.com somecommand
bash ausführen und Ihre Anmeldeshell aktiviert ist host.example.com
).
- Wenn es explizit aufgerufen wird, z. B. in einem Benutzer
.bash_profile
( die Auswahl der Startdateien durch Bash ist etwas seltsam ).
[ -t 1 ]
ist ein schlechter Weg, um interaktive Shells zu erkennen. Es ist möglich, aber selten, bash interaktiv mit Standardausgaben auszuführen, die nicht an ein Terminal gesendet werden. Normalerweise wird die Standardausgabe in einer nicht interaktiven Shell an ein Terminal gesendet. Bei einer nicht interaktiven Shell läuft kein Geschäft, .bashrc
aber von SSH aufgerufene Bash-Shells tun dies leider. Es gibt einen viel besseren Weg: bash (und jede andere Shell im Sh-Stil) bietet eine eingebaute, zuverlässige Methode, um dies zu tun.
case $- in
*i*) echo this shell is interactive;;
*) echo this shell is not interactive;;
esac
Also sollte "start zsh wenn dies eine interaktive Shell ist" geschrieben werden
case $- in
*i*) exec zsh;;
esac
Aber auch das ist keine gute Idee: Es verhindert das Öffnen einer Bash-Shell, was selbst bei Verwendung von zsh nützlich ist. Vergessen Sie diesen Blog-Beitrag und konfigurieren Sie stattdessen einfach Ihre Verknüpfung, die ein Terminal öffnet, um zsh anstelle von bash auszuführen. Ordnen Sie die Dinge nicht so an, dass "wenn Sie die Bash-Anwendung unter Windows öffnen, wird sie jetzt mit der Zsh-Shell gestartet": Wenn Sie Zsh möchten, öffnen Sie die Zsh-Anwendung.
bash
auch dann lesen kann,.bashrc
wenn dies nicht der Fall ist interaktiv (wie inssh host cmd
wobash
ist die Login-Shell des Benutzers auf dem Host oderbash --login -c 'some code'
wo die.bash_profile
Quellen die.bashrc
).case $- in *i*)...
ist der richtige Weg, um zu testen, ob eine Shell interaktiv ist.