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