Como posso fazer check-in se um shell estiver executando no modo interativo?

41

Como posso saber (em ~/.bashrc ) se estou executando em modo interativo ou, digamos, executando um comando por ssh. Eu quero evitar a impressão de seqüências de escape ANSI em .bashrc se for o último.

    
por Alex B 31.05.2010 / 01:53

4 respostas

46

De acordo com man bash :

PS1 is set and $- includes i if bash is interactive, allowing a shell script or a startup file to test this state.

Então você pode usar:

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

Além disso:

When an interactive shell that is not a login shell is started, bash reads and executes commands from /etc/bash.bashrc and ~/.bashrc, if these files exist.

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

É melhor se não houver saída para stdout a partir do login rc arquivos como ~/.bash_profile ou ~/.profile , pois isso pode interferir na operação adequada de rsync , por exemplo.

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

    
por 31.05.2010 / 02:08
11

Uso:

if tty -s; then echo interactive; fi
    
por 03.06.2013 / 12:50
9

a ferramenta test pode verificar isso (na página man):

 -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
    
por 02.02.2016 / 14:12
6

Eu normalmente vejo a saída do programa tty.

Se você estiver em um tty, ele vai te dizer qual é a sua tty. Se você não está no modo interativo, ele normalmente diz algo como "não é um tty".

    
por 31.05.2010 / 01:54