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 somecommand
e 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, .bashrc
mas 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.
bash
pode ler.bashrc
mesmo quando não está. interativo (como emssh host cmd
ondebash
está o shell de login do usuário no host oubash --login -c 'some code'
onde as.bash_profile
fontes estão.bashrc
).case $- in *i*)...
é a maneira correta de testar se um shell é interativo.