Wie kann ich feststellen, ~/.bashrc
ob ich mich im interaktiven Modus befinde oder einen Befehl über ssh ausführe? Ich möchte vermeiden, dass ANSI-Escape-Sequenzen gedruckt werden, .bashrc
wenn dies die letztere ist.
Wie kann ich feststellen, ~/.bashrc
ob ich mich im interaktiven Modus befinde oder einen Befehl über ssh ausführe? Ich möchte vermeiden, dass ANSI-Escape-Sequenzen gedruckt werden, .bashrc
wenn dies die letztere ist.
Antworten:
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 ~/.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 kann rsync
.
In jedem Fall ist es immer noch eine gute Idee, die Interaktivität zu testen, da möglicherweise eine falsche Konfiguration vorliegt.
[[ $- =~ 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:
if tty -s; then echo interactive; fi
Das test
Tool 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
bash <<< 'test -t 0 && echo Y || echo X'
schreibt Y
, 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.