Системные настройки → Стиль приложения → Украшения окна → Кнопки.
Команда test[ -t 1 ]
проверяет, находится ли вывод bash на терминале. Цель этой строки явно состоит в том, чтобы запускать zsh при открытии терминала, не нарушая другие способы использования bash. Но сделано очень плохо.
Файл .bashrc
читается в трех случаях:
ssh host.example.com какую-то команду
и bash является вашей оболочкой для входа на host.example.com
)..bash_profile
( выбор файлов запуска bash немного странный). [ -t 1 ]
— плохой способ обнаружения интерактивных оболочек. Возможно, но редко, запускать bash в интерактивном режиме со стандартным выводом, не поступающим на терминал. Стандартный вывод чаще всего идет на терминал в неинтерактивной оболочке; неинтерактивная оболочка не имеет права запускать .bashrc
, но, к сожалению, оболочки bash, вызываемые 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.
[]
является ярлыком команды test
.
Согласноman test
:
-t FD
True if FD is a file descriptor that is associated with a terminal.
Таким образом, если вы используете bash как интерактивную оболочку (терминал -, см. эту ветку для объяснения терминологии ), bash будет заменен на zsh.
Подробнее о файлах.bash *:
When bash is invoked as an interactive login shell, or as a non-interactive shell with the --login option, it first reads and executes commands from the file /etc/profile, if that file exists. After reading that file, it looks for ~/.bash_profile, ~/.bash_login, and ~/.profile, in that order, and reads and executes commands from the first one that exists and is readable. The --noprofile option may be used when the shell is started to inhibit this behavior.
When a login shell exits, bash reads and executes commands from the files ~/.bash_logout and /etc/bash.bash_logout, if the files exists.
When an interactive shell that is not a login shell is started, bash reads and executes commands from ~/.bashrc, if that file exists. This may be inhibited by using the --norc option. The --rcfile file option will force bash to read and execute commands from file instead of ~/.bashrc.
Комментарий Стефана Шазела:
Обратите внимание, что оболочка может быть интерактивной без того, чтобы стандартный вывод был терминалом, и оболочка может быть не -интерактивной с терминалом на стандартном выходе (, как в любое время, когда вы запускаете скрипт в терминале без перенаправления/передачи его вывода ), и bash
может читать .bashrc
, даже если он не интерактивен (, как в ssh host cmd
, где bash
— это оболочка входа пользователя на хосте, илиbash --login -c 'some code'
). case $- in *i*)...
— это правильный способ проверить, является ли оболочка интерактивной.
-t FD
file descriptor FD is opened on a terminal
В вашем примере выполняется (заменяет запущенный процесс, в данном случаеbash
)на zsh
, если стандартный вывод открыт на терминале (не файл/канал/и т. д. ).