Команда test [ -t 1 ]
проверяет, находится ли вывод bash на терминале. Цель этой строки - запустить zsh при открытии терминала, не нарушая другие способы использования bash. Но это сделано очень плохо.
Файл .bashrc
читается в трех случаях:
- Когда bash выполняется как интерактивная оболочка, т.е. для запуска команд, набранных пользователем, а не для выполнения пакетных команд.
- Когда bash - это неинтерактивная оболочка, которая запускается демоном RSH или SSH (обычно потому, что вы запускаете,
ssh host.example.com somecommand
а bash является вашей оболочкой входа в систему host.example.com
).
- Когда он вызывается явно, например, у пользователя
.bash_profile
( выбор файлов запуска bash немного странный ).
[ -t 1 ]
плохой способ обнаружения интерактивных оболочек. Можно, но редко, запускать bash в интерактивном режиме со стандартным выводом, не выходя на терминал. Чаще встречается стандартный вывод на терминал в неинтерактивной оболочке; неинтерактивная оболочка не работает, .bashrc
но, к сожалению, командные оболочки, вызываемые SSH, делают. Есть гораздо лучший способ: bash (и любая другая оболочка в стиле sh) предоставляет встроенный надежный метод для этого.
case $- in
*i*) echo this shell is interactive;;
*) echo this shell is not interactive;;
esac
Поэтому «запустите zsh, если это интерактивная оболочка»
case $- in
*i*) exec zsh;;
esac
Но даже это не очень хорошая идея: это предотвращает открытие оболочки bash, что полезно, даже если вы используете zsh. Забудьте об этом сообщении в блоге и вместо этого просто настройте ярлык, который открывает терминал для запуска zsh вместо bash. Не делайте так, чтобы «всякий раз, когда вы открываете приложение Bash в Windows, оно теперь запускается с оболочкой Zsh»: когда вы хотите zsh, откройте приложение Zsh.
bash
может читать,.bashrc
даже если нет интерактивный (например,ssh host cmd
гдеbash
находится оболочка входа пользователя на хост илиbash --login -c 'some code'
где находятся.bash_profile
источники.bashrc
).case $- in *i*)...
правильный способ проверить, является ли оболочка интерактивной.