Wie kann ich Bash einchecken, wenn eine Shell im interaktiven Modus ausgeführt wird?


46

Wie kann ich feststellen, ~/.bashrcob ich mich im interaktiven Modus befinde oder einen Befehl über ssh ausführe? Ich möchte vermeiden, dass ANSI-Escape-Sequenzen gedruckt werden, .bashrcwenn dies die letztere ist.


Die Entscheidung, ob Escape-Sequenzen gedruckt werden sollen oder nicht, sollte auf dem Wert von $ TERM und nicht auf der Interaktivität der Shell basieren. Die Variable gibt die Funktionen des Client-Terminals an, das der Teil ist, der die Escape-Sequenzen interpretiert.
26.

Antworten:


53

Nach man bash:

PS1 ist gesetzt und $ - enthält i, wenn bash interaktiv ist, sodass ein Shell-Skript oder eine Startdatei diesen Status testen kann.

So können Sie verwenden:

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

Ebenfalls:

Wenn eine interaktive Shell gestartet wird, die keine Anmeldeshell ist, liest bash Befehle aus /etc/bash.bashrc und ~ / .bashrc und führt sie aus, sofern diese Dateien vorhanden sind.

Wird ~/.bashrcalso nur für interaktive Shells bezogen. Manchmal wird es von Personen bezogen ~/.bash_profileoder es ~/.profileist falsch, da es das erwartete Verhalten stört. Wenn Sie die Wartung von gemeinsamem Code vereinfachen möchten, sollten Sie eine separate Datei verwenden, um den gemeinsamen Code zu enthalten, und ihn unabhängig von beiden RC-Dateien als Quelle verwenden.

Es ist am besten, wenn es keine Ausgabe von Anmeldedateien zu stdout gibt, rcwie z. B. ~/.bash_profileoder ~/.profileweil dies den ordnungsgemäßen Betrieb von stören kann rsync.

In jedem Fall ist es immer noch eine gute Idee, die Interaktivität zu testen, da möglicherweise eine falsche Konfiguration vorliegt.


7
Beachten Sie, dass $ - ein i enthalten kann , das nicht unbedingt gleich ist. Ich benutze[[ $- =~ i ]] && echo interactive
Alex Howansky

1
@ AlexHowansky: die Sternchen im Gleichheitstest machen es zu einem Test für die Aufnahmei
Dennis Williamson

Oh wow, die haben ich gar nicht bemerkt, sie sehen auf meinem Monitor wie doppelte Anführungszeichen aus. Es kann an der Zeit sein, die Schriftgröße zu erhöhen. <in die Jahre gekommen>
Alex Howansky

Manchmal beziehen die Leute es von ~/.bash_profileoder ~/.profilewas falsch ist, da es das erwartete Verhalten stört . Was denken Sie über die Beschaffung ~/.bashrcvon ~/.bash_login? Da die Login-Shell nicht interaktiv sein muss, ist sie vermutlich auch falsch.
Piotr Dobrogost

1
@PiotrDobrogost: Dies ist eine hervorragende Diskussion über Shell-Startdateien.
Dennis Williamson

12

Verwenden:

if tty -s; then echo interactive; fi

Scheint nicht zu funktionieren
Steven Shaw

Das scheint auch für mich nicht zu funktionieren, ich denke, das ist die richtige Antwort: stackoverflow.com/a/49064632/1223975
Alexander Mills

Dies prüft, ob ein TTY auf der Standardeingabe vorhanden ist. Obwohl es verwandt sein kann, ist es nicht dasselbe wie der interaktive Modus der Shell, der durch das "-i" -Flag der Shell angezeigt wird.
26.

funktioniert nicht. Warum haben sich die Leute empört?
Setop

11

Das testTool kann dies überprüfen (von der Manpage):

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

So können Sie zum Beispiel verwenden:

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

oder

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

Schön und scheint zwischen den Schalen tragbar zu sein. TEST es bash <<< 'test -t 0 && echo Y || echo X'schreibt Y, bash -c 'test -t 0 && echo Y || echo X'schreibtX
kyb

1
Dies bestätigt auch, dass die Standardeingabe ein TTY ist. Obwohl es verwandt sein kann, ist es NICHT dasselbe wie der interaktive Modus der Shell, der durch das "-i" -Flag der Shell angefordert und angezeigt wird.
26.

6

Normalerweise schaue ich mir die Ausgabe des Programms tty an.

Wenn Sie auf einem Tty sind, wird es Ihnen sagen, auf welchem ​​Tty Sie sind. Wenn Sie sich nicht im interaktiven Modus befinden, wird Ihnen normalerweise "not a tty" angezeigt.


3
tty -s setzt einen Rückgabewert von 0, wenn Sie sich an einem Terminal befinden, oder 1, ohne dass Sie eine Ausgabe erhalten. Sie können es als 'if tty -s verwenden; dann _interactive; fi '
BillThor

Vielen Dank! Es ist lange her , dass ich so etwas tun musste und ich glaube, ich habe einige Details vergessen ...
Chris
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.