O comando test [ -t 1 ] verifica se a saída do bash está em um terminal. A intenção desta linha é claramente executar o zsh ao abrir um terminal, sem interromper outros usos do bash. Mas é feito muito mal.
O arquivo .bashrcé lido em três circunstâncias:
- Quando o bash é executado como um shell interativo, ou seja, para executar comandos digitados pelo usuário, em vez de executar comandos em lote.
- Quando bash é um shell não interativo que é executado por um daemon RSH ou SSH (normalmente porque você executa
ssh host.example.com somecommande o bash é seu shell de logon host.example.com).
- Quando é chamado explicitamente, por exemplo, no usuário
.bash_profile( a escolha dos arquivos de inicialização do bash é um pouco estranha ).
[ -t 1 ]é uma maneira ruim de detectar shells interativos. É possível, mas raro, executar o bash interativamente com a saída padrão que não vai para um terminal. É mais comum ter saída padrão indo para um terminal em um shell não interativo; um shell não interativo não tem negócios em execução, .bashrcmas infelizmente os shells bash invocados pelo SSH fazem. Existe uma maneira muito melhor: o bash (e qualquer outro shell do estilo sh) fornece um método confiável e incorporado para fazer isso.
case $- in
*i*) echo this shell is interactive;;
*) echo this shell is not interactive;;
esac
Portanto, “lance o zsh se for um shell interativo” deve ser escrito
case $- in
*i*) exec zsh;;
esac
Mas mesmo isso não é uma boa ideia: impede a abertura de um shell bash, o que é útil mesmo se você usar o zsh. Esqueça esta postagem no blog e simplesmente configure seu atalho que abre um terminal para executar o zsh em vez do bash. Não organize as coisas para que “sempre que você abrir o aplicativo Bash no Windows, ele iniciará com o shell Zsh”: quando você quiser o zsh, abra o aplicativo Zsh.
bashpode ler.bashrcmesmo quando não está. interativo (como emssh host cmdondebashestá o shell de login do usuário no host oubash --login -c 'some code'onde as.bash_profilefontes estão.bashrc).case $- in *i*)...é a maneira correta de testar se um shell é interativo.