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 .bashrcjest 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 somecommandi 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, .bashrcale 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.
bashmoże czytać,.bashrcnawet jeśli nie jest interaktywne (np.ssh host cmdgdziebashznajduje 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.