Команда 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*)...правильный способ проверить, является ли оболочка интерактивной.