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_stufffi
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.
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.
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):
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.
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 ...
Antworten:
Nach
man bash
:So können Sie verwenden:
Ebenfalls:
Wird
~/.bashrc
also nur für interaktive Shells bezogen. Manchmal wird es von Personen bezogen~/.bash_profile
oder es~/.profile
ist 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,
rc
wie z. B.~/.bash_profile
oder~/.profile
weil dies den ordnungsgemäßen Betrieb von stören kannrsync
.In jedem Fall ist es immer noch eine gute Idee, die Interaktivität zu testen, da möglicherweise eine falsche Konfiguration vorliegt.
quelle
[[ $- =~ i ]] && echo interactive
i
~/.bash_profile
oder~/.profile
was falsch ist, da es das erwartete Verhalten stört . Was denken Sie über die Beschaffung~/.bashrc
von~/.bash_login
? Da die Login-Shell nicht interaktiv sein muss, ist sie vermutlich auch falsch.Verwenden:
quelle
Das
test
Tool kann dies überprüfen (von der Manpage):So können Sie zum Beispiel verwenden:
oder
quelle
bash <<< 'test -t 0 && echo Y || echo X'
schreibtY
,bash -c 'test -t 0 && echo Y || echo X'
schreibtX
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.
quelle