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 .bashrc
se è quest'ultima.
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 .bashrc
se è quest'ultima.
Risposte:
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 ~/.bashrc
viene fornito solo per shell interattive. A volte, le persone lo provengono ~/.bash_profile
o ~/.profile
che 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 rc
file di login come ~/.bash_profile
o ~/.profile
poiché può interferire con il corretto funzionamento di rsync
per esempio.
In ogni caso, è comunque una buona idea testare l'interattività poiché potrebbe esistere una configurazione errata.
[[ $- =~ i ]] && echo interactive
i
~/.bash_profile
o ~/.profile
che è errato poiché interferisce con il comportamento previsto Giusto. Cosa ne pensi di approvvigionamento ~/.bashrc
da ~/.bash_login
? Poiché la shell di accesso non deve essere interattiva, immagino che sia errata.
Uso:
if tty -s; then echo interactive; fi
lo test
strumento 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
bash <<< 'test -t 0 && echo Y || echo X'
scrive Y
, bash -c 'test -t 0 && echo Y || echo X'
scriveX
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".