[]
это ярлык test
команды.
По словам man test
:
-t FD
Истинно, если FD - дескриптор файла, связанный с терминалом.
Поэтому, если вы запускаете bash в качестве интерактивной оболочки (терминал - см. Этот поток для объяснения терминологии), bash будет заменен на zsh.
Подробнее о .bash * файлах:
Когда bash вызывается как интерактивная оболочка входа в систему или как
неинтерактивная оболочка с параметром --login , она сначала читает и выполняет команды из файла / etc / profile, если этот файл существует. После прочтения этого файла он ищет ~ / .bash_profile, ~ / .bash_login и ~ / .profile в указанном порядке, а также читает и выполняет команды из первой, которая существует и доступна для чтения. Опция --noprofile может использоваться, когда оболочка запущена, чтобы запретить это поведение.
При выходе из оболочки входа в систему bash читает и выполняет команды из файлов ~ / .bash_logout и /etc/bash.bash_logout, если файлы существуют.
Когда запускается интерактивная оболочка, которая не является оболочкой входа в систему , bash читает и выполняет команды из ~ / .bashrc , если этот файл существует. Это может быть запрещено с помощью параметра --norc. Опция --rcfile file заставит bash читать и выполнять команды из файла вместо ~ / .bashrc.
Комментарий Стефана Чазела:
обратите внимание, что оболочка может быть интерактивной, а stdout не является терминалом, а оболочка может быть неинтерактивной с терминалом на stdout (как в любое время, когда вы запускаете скрипт в терминале без перенаправления / передачи его вывода), и bash
может читать, .bashrc
даже когда он не интерактивный (например, ssh host cmd
где bash
находится оболочка входа пользователя на хост или bash --login -c 'some code'
). case $- in *i*)...
правильный способ проверить, является ли оболочка интерактивной.
bash
может читать,.bashrc
даже если нет интерактивный (например,ssh host cmd
гдеbash
находится оболочка входа пользователя на хост илиbash --login -c 'some code'
где находятся.bash_profile
источники.bashrc
).case $- in *i*)...
правильный способ проверить, является ли оболочка интерактивной.i
она будет установлена (и в современных оболочках, которые можно протестироватьif
вместо использованияcase
). Но во многих случаях используется только то, подключен ли к терминалу stdout (или stdin, или stderr ...).Команда test
[ -t 1 ]
проверяет, находится ли вывод bash на терминале. Цель этой строки - запустить zsh при открытии терминала, не нарушая другие способы использования bash. Но это сделано очень плохо.Файл
.bashrc
читается в трех случаях:ssh host.example.com somecommand
а bash является вашей оболочкой входа в системуhost.example.com
)..bash_profile
( выбор файлов запуска bash немного странный ).[ -t 1 ]
плохой способ обнаружения интерактивных оболочек. Можно, но редко, запускать bash в интерактивном режиме со стандартным выводом, не выходя на терминал. Чаще встречается стандартный вывод на терминал в неинтерактивной оболочке; неинтерактивная оболочка не работает,.bashrc
но, к сожалению, командные оболочки, вызываемые SSH, делают. Есть гораздо лучший способ: bash (и любая другая оболочка в стиле sh) предоставляет встроенный надежный метод для этого.Поэтому «запустите zsh, если это интерактивная оболочка»
Но даже это не очень хорошая идея: это предотвращает открытие оболочки bash, что полезно, даже если вы используете zsh. Забудьте об этом сообщении в блоге и вместо этого просто настройте ярлык, который открывает терминал для запуска zsh вместо bash. Не делайте так, чтобы «всякий раз, когда вы открываете приложение Bash в Windows, оно теперь запускается с оболочкой Zsh»: когда вы хотите zsh, откройте приложение Zsh.
источник
rsh
/ssh
и для интерактивной оболочки, это если это не оболочка входа в систему. Для оболочек входа в систему (sshd
не запускается неинтерактивная оболочка входа в систему, но вы можете сделать это с помощьюssh host exec bash -l
),.bash_profile
вместо этого читается. Также обратите внимание, что дляrsh
/ssh
, вы также должны$SHLVL
быть unset или 0.человек 1 тест :
Ваш пример выполняется (в данном случае заменяет запущенный процесс
bash
)zsh
на on, если на терминале открыт stdout (не файл / pipe / etc).источник