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


46

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


Optar por imprimir ou não sequências de escape é melhor basear-se no valor de $ TERM e não na interatividade do shell. A variável identifica as capacidades do terminal do cliente, que é a parte que interpreta as seqüências de escape.
yrk

Respostas:


53

De acordo com man bash:

O 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

Além disso:

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 conchas interativas. Às vezes, as pessoas o extraem ~/.bash_profileou o ~/.profileque está incorreto, pois interfere no comportamento esperado. Se você deseja simplificar a manutenção de código comum, use um arquivo separado para conter o código comum e origine-o independentemente dos dois arquivos rc.

É melhor se não houver saída para stdout a partir de rcarquivos de logon , como ~/.bash_profileou, ~/.profileuma vez que isso pode interferir na operação correta do, rsyncpor exemplo.

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


7
Observe que $ - pode conter um i, não necessariamente igual a ele. Eu uso[[ $- =~ i ]] && echo interactive
Alex Howansky

1
@AlexHowansky: os asteriscos no teste de igualdade de torná-lo um teste para conteri
Dennis Williamson

Oh, uau, nem percebi isso, eles parecem aspas duplas no meu monitor. Talvez esteja na hora de aumentar o tamanho da fonte. <envelhecendo> #
Alex Howansky 28/02

Às vezes, as pessoas o buscam ~/.bash_profileou ~/.profileestão incorretas, pois isso interfere no comportamento esperado . O que você acha de abastecimento ~/.bashrcde ~/.bash_login? Como o shell de login não precisa ser interativo, acho que também está incorreto.
Piotr Dobrogost

1
@PiotrDobrogost: Esta é uma excelente discussão sobre arquivos de inicialização do shell.
Dennis Williamson

12

Usar:

if tty -s; then echo interactive; fi

Não parece trabalho
Steven Shaw

isso não parece trabalhar para mim também, eu acho que esta é a resposta correta: stackoverflow.com/a/49064632/1223975
Alexander Mills

isso verifica a presença de um TTY na entrada padrão; embora possa estar relacionado, mas não é o mesmo que o modo interativo do shell, indicado pelo sinalizador "-i" do shell.
yrk

não funciona. por que as pessoas votaram?
Setop 15/10

11

a testferramenta pode verificar isso (a partir da 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

Bom e parece ser portátil entre conchas. TESTE que bash <<< 'test -t 0 && echo Y || echo X'escreve Y, bash -c 'test -t 0 && echo Y || echo X'escreveX
kyb

1
isso também verifica se a entrada padrão é um TTY; embora possa estar relacionado, mas NÃO é o mesmo que o modo interativo do shell, que é solicitado e indicado pelo sinalizador "-i" do shell.
yrk

6

Eu normalmente olho para a saída do programa tty.

Se você estiver em um tty, ele informará em que tty você está. Se você não estiver no modo interativo, normalmente será exibido algo como "não é um tty".


3
tty -s definirá um valor de retorno 0 se você estiver em um terminal ou 1 caso contrário, sem fornecer saída. Você pode usá-lo como 'if tty -s; então _interativo; fi '
BillThor

Obrigado! Tem sido um longo tempo desde que eu precisava fazer esse tipo de coisa e eu acho que eu esqueci alguns dos detalhes ...
chris
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.