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