O que [-t 1] verifica?

9

Acabei de encontrar uma maneira de iniciar o zsh ao iniciar o bash no Windows a partir de

link .

Recomendamos adicionar o seguinte código no último dia de .bashrc .

# Launch Zsh
if [ -t 1 ]; then
exec zsh
fi

O que significa [ -t 1 ] ?

É apenas verdade?

Então, posso fazer isso?

exec zsh
    
por Jin Kwon 31.08.2017 / 14:53

3 respostas

12

[] é 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.

    
por 31.08.2017 / 14:58
9

O comando de teste [ -t 1 ] verifica se a saída do bash é em um terminal. A intenção desta linha é claramente executar o zsh ao abrir um terminal, sem interromper outros usos do bash. Mas está 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 (geralmente porque você executa ssh host.example.com somecommand e bash é seu shell de login em host.example.com ).
  • Quando é invocado explicitamente, por ex. na escolha do .bash_profile ( do bash dos arquivos de inicialização é um um pouco estranho ).

[ -t 1 ] é uma maneira ruim de detectar shells interativos. É possível, mas raro, executar bash interativamente com a saída padrão não indo para um terminal. É mais comum ter uma saída padrão indo para um terminal em um shell não interativo; um shell não interativo não tem nenhum negócio executando .bashrc , mas infelizmente os shells bash invocados pelo SSH fazem. Existe uma maneira muito melhor: o bash (e qualquer outro shell sh-style) fornece um método integrado e confiável para fazê-lo.

case $- in
  *i*) echo this shell is interactive;;
  *) echo this shell is not interactive;;
esac

Então, "lançar o zsh se este for um shell interativo" deve ser escrito

case $- in
  *i*) exec zsh;;
esac

Mas mesmo isso não é uma boa idéia: ele impede a abertura de um shell bash, o que é útil mesmo se você usar zsh. Esqueça essa postagem do blog e, em vez disso, simplesmente configure seu atalho que abre um terminal para executar zsh em vez de bash. Não organize as coisas para que “sempre que você abrir o aplicativo Bash no Windows, ele inicie agora com o shell Zsh”: quando você quiser zsh, abra o aplicativo Zsh.

    
por 01.09.2017 / 01:38
5

teste do homem 1 :

-t FD

file descriptor FD is opened on a terminal

Seu exemplo é executado (substitui o processo em execução, neste caso bash ) por zsh se stdout estiver aberto em um terminal (não em um arquivo / canal / etc).

    
por 31.08.2017 / 14:56