Como posso verificar no bash se um shell está sendo executado no modo interativo?

Como posso verificar no bash se um shell está sendo executado no modo interativo?

Como posso saber (in ~/.bashrc) se estou executando no modo interativo ou, digamos, executando um comando por ssh. Quero evitar a impressão de sequências de escape ANSI, .bashrcse for o último.

Responder1

De acordo com man bash:

PS1 está definido e $- inclui i se o bash for interativo, permitindo que um script de shell ou um arquivo de inicialização teste esse estado.

Então você pode usar:

if [[ $- == *i* ]]
then
    do_interactive_stuff
fi

Também:

Quando um shell interativo que não é um shell de login é iniciado, o bash lê e executa comandos de /etc/bash.bashrc e ~/.bashrc, se esses arquivos existirem.

Portanto, ~/.bashrcé fornecido apenas para shells interativos. Às vezes, as pessoas o obtêm de ~/.bash_profileou ~/.profileo que é incorreto, pois interfere no comportamento esperado. Se quiser simplificar a manutenção do código comum, você deve usar um arquivo separado para conter o código comum e originá-lo independentemente de ambos os arquivos rc.

É melhor se não houver saída para stdout de rcarquivos de login, como ~/.bash_profileou, ~/.profilepois isso pode interferir na operação adequada, rsyncpor exemplo.

De qualquer forma, ainda é uma boa ideia testar a interatividade, pois pode haver configuração incorreta.

Responder2

a testferramenta pode verificar isso (na página de manual):

 -t FD          True if FD is opened on a terminal.

Então você pode usar por exemplo:

 if [ -t 0 ] ; then
    echo stdin is a terminal
   .....
 fi

ou

if [ -t 1 ] ; then
    echo stdout is a terminal
 fi

Responder3

Usar:

if tty -s; then echo interactive; fi

Responder4

É assim que o Red Hat faz... Acho que é o caminho mais rápido...

if [ "${-#*i}" == "$-" ]; then

Significa obter os parâmetros do bash, fazer uma remoção de substring, o mais curto possível, combinar tudo entre o início e i. Em seguida, verifique se é igual aos parâmetros bash originais.

Verifique se você fez seu trabalho conectando-se ao usuário usando sftp; ele falhará se sessões não interativas tiverem saída

informação relacionada