Что проверяет [-t 1]?

Системные настройки → Стиль приложения → Украшения окна → Кнопки.

12
04.09.2017, 17:13
3 ответа

Команда test[ -t 1 ]проверяет, находится ли вывод bash на терминале. Цель этой строки явно состоит в том, чтобы запускать zsh при открытии терминала, не нарушая другие способы использования bash. Но сделано очень плохо.

Файл .bashrcчитается в трех случаях:

  • Когда bash выполняется как интерактивная оболочка, то есть для запуска команд, введенных пользователем, а не для выполнения пакетных команд.
  • Когда bash является неинтерактивнойоболочкой, которая запускается демоном RSH или SSH (обычно потому, что вы запускаете 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.

11
27.01.2020, 19:54

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

19
27.01.2020, 19:54

мужчина 1 тест:

-t FD

file descriptor FD is opened on a terminal

В вашем примере выполняется (заменяет запущенный процесс, в данном случаеbash)на zsh, если стандартный вывод открыт на терминале (не файл/канал/и т. д. ).

5
27.01.2020, 19:54

Теги

Похожие вопросы