Polecenie testowe [ -t 1 ]
sprawdza, czy wyjście bash jest w terminalu. Celem tej linii jest oczywiście uruchomienie zsh podczas otwierania terminala, bez zakłócania innych zastosowań bash. Ale zrobiono to bardzo źle.
Plik .bashrc
jest odczytywany w trzech okolicznościach:
- Gdy bash jest wykonywany jako interaktywna powłoka, tj. Do uruchamiania poleceń wpisanych przez użytkownika, a nie do wykonywania poleceń wsadowych.
- Gdy bash jest nieinteraktywną powłoką, która jest uruchamiana przez demona RSH lub SSH (zazwyczaj dlatego, że działasz
ssh host.example.com somecommand
i bash jest twoją powłoką logowania host.example.com
).
- Gdy jest wywoływany jawnie, np. U użytkownika
.bash_profile
( wybór plików startowych przez bash jest nieco dziwny ).
[ -t 1 ]
jest złym sposobem wykrywania interaktywnych powłok. Możliwe jest, ale rzadko, uruchamianie basha interaktywnie ze standardowym wyjściem, który nie przechodzi do terminala. Częściej zdarza się, że standardowe wyjście trafia do terminala w nieinteraktywnej powłoce; nieinteraktywna powłoka nie działa, .bashrc
ale niestety powłoki bash wywoływane przez SSH do. Jest o wiele lepszy sposób: bash (i każda inna powłoka w stylu sh) zapewnia wbudowaną, niezawodną metodę tego.
case $- in
*i*) echo this shell is interactive;;
*) echo this shell is not interactive;;
esac
Dlatego należy napisać „uruchom zsh, jeśli jest to powłoka interaktywna”
case $- in
*i*) exec zsh;;
esac
Ale nawet to nie jest dobry pomysł: zapobiega otwieraniu powłoki bash, co jest przydatne, nawet jeśli używasz zsh. Zapomnij o tym wpisie na blogu i zamiast tego skonfiguruj skrót otwierający terminal do uruchamiania zsh zamiast bash. Nie układaj rzeczy w taki sposób, aby „za każdym razem, gdy otworzysz aplikację Bash w systemie Windows, uruchomi się ona z powłoką Zsh”: kiedy chcesz zsh, otwórz aplikację Zsh.
bash
może czytać,.bashrc
nawet jeśli nie jest interaktywne (np.ssh host cmd
gdziebash
znajduje się powłoka logowania użytkownika na hoście lubbash --login -c 'some code'
gdzie.bash_profile
źródła.bashrc
).case $- in *i*)...
jest poprawnym sposobem sprawdzenia, czy powłoka jest interaktywna.