Come posso controllare bash se una shell è in esecuzione in modalità interattiva?


46

Come posso sapere (in ~/.bashrc) se sto correndo in modalità interattiva o, per esempio, eseguendo un comando su ssh. Voglio evitare la stampa di sequenze di escape ANSI .bashrcse è quest'ultima.


Scegliere se stampare sequenze di escape o meno è meglio basarsi sul valore $ TERM e non sull'interattività della shell. La variabile identifica le capacità del terminale client che è la parte che interpreta le sequenze di escape.
anno

Risposte:


53

Secondo man bash:

PS1 è impostato e $ - include i se bash è interattivo, consentendo a uno script di shell o un file di avvio di testare questo stato.

Quindi puoi usare:

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

Anche:

Quando viene avviata una shell interattiva che non è una shell di accesso, bash legge ed esegue i comandi da /etc/bash.bashrc e ~ / .bashrc, se questi file esistono.

Quindi ~/.bashrcviene fornito solo per shell interattive. A volte, le persone lo provengono ~/.bash_profileo ~/.profileche non è corretto poiché interferisce con il comportamento previsto. Se si desidera semplificare la manutenzione del codice comune, è necessario utilizzare un file separato per contenere il codice comune e generarlo indipendentemente da entrambi i file rc.

È meglio se non esiste alcun output per stdout da rcfile di login come ~/.bash_profileo ~/.profilepoiché può interferire con il corretto funzionamento di rsyncper esempio.

In ogni caso, è comunque una buona idea testare l'interattività poiché potrebbe esistere una configurazione errata.


7
Nota che $ - può contenere una i, non necessariamente uguale. Io uso[[ $- =~ i ]] && echo interactive
Alex Howansky il

1
@AlexHowansky: gli asterischi nel test di uguaglianza lo rendono un test per contenerei
Dennis Williamson,

Oh, wow, non me ne sono nemmeno accorto, sembrano due virgolette sul monitor. Potrebbe essere il momento di aumentare la dimensione del carattere. <invecchiando>
Alex Howansky,

A volte, le persone lo provengono da ~/.bash_profileo ~/.profileche è errato poiché interferisce con il comportamento previsto Giusto. Cosa ne pensi di approvvigionamento ~/.bashrcda ~/.bash_login? Poiché la shell di accesso non deve essere interattiva, immagino che sia errata.
Piotr Dobrogost,

1
@PiotrDobrogost: Questa è un'eccellente discussione sui file di avvio della shell.
Dennis Williamson,

12

Uso:

if tty -s; then echo interactive; fi

Non sembra funzionare
Steven Shaw,

questo non sembra funzionare neanche per me, penso che questa sia la risposta corretta: stackoverflow.com/a/49064632/1223975
Alexander Mills

questo verifica la presenza di un TTY sull'input standard; sebbene possa essere correlato ma non è lo stesso della modalità interattiva della shell, che è indicata dal flag "-i" della shell.
anno

non funziona perché le persone hanno votato?
Setop

11

lo teststrumento può verificarlo (dalla pagina man):

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

Quindi puoi usare ad esempio:

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

o

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

Bello e sembra essere portatile tra le conchiglie. TEST bash <<< 'test -t 0 && echo Y || echo X'scrive Y, bash -c 'test -t 0 && echo Y || echo X'scriveX
kyb

1
ciò verifica anche che l'input standard sia un TTY; sebbene possa essere correlato ma NON è uguale alla modalità interattiva della shell, che è richiesta e indicata dal flag "-i" della shell.
anno

6

In genere guardo l'output del programma tty.

Se sei su un tty, ti dirà su quale tty sei. Se non sei in modalità interattiva, in genere ti dirà qualcosa come "non un tty".


3
tty -s imposterà un valore di ritorno pari a 0 se ci si trova su un terminale o 1 altrimenti senza fornire un output. Puoi usarlo come 'if tty -s; quindi _interattivo; fi '
BillThor,

Grazie! È passato molto tempo da quando ho dovuto fare questo genere di cose e immagino di aver dimenticato alcuni dettagli ...
chris
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.