[]
é o atalho do comando test
.
De acordo com man test
:
-t FD
True if FD is a file descriptor that is associated with a terminal.
Portanto, se você estiver executando o bash como shell interativo (terminal - consulte este tópico para explicação terminológica), o bash será substituído por zsh.
Mais sobre arquivos .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.
Stéphane Chazelas comenta:
Observe que um shell pode ser interativo sem stdout ser um terminal e um shell pode ser não interativo com um terminal em stdout (como sempre que você executa um script em um terminal sem redirecionar / direcionar sua saída) e bash
pode ler .bashrc
mesmo quando não é interativo (como em ssh host cmd
, em que bash
é o shell de login do usuário no host ou bash --login -c 'some code'
). case $- in *i*)...
é a maneira correta de testar se um shell é interativo.