Wie kann ich (in ) feststellen, ob ich im interaktiven Modus arbeite oder beispielsweise einen Befehl über SSH ausführe? In letzterem Fall ~/.bashrc
möchte ich das Drucken von ANSI-Escapesequenzen in vermeiden ..bashrc
Antwort1
Entsprechend man bash
:
PS1 ist festgelegt und $- enthält i, wenn Bash interaktiv ist, sodass dieser Status über ein Shell-Skript oder eine Startdatei getestet werden kann.
Sie können also Folgendes verwenden:
if [[ $- == *i* ]]
then
do_interactive_stuff
fi
Auch:
Wenn eine interaktive Shell gestartet wird, die keine Anmelde-Shell ist, liest und führt bash Befehle aus /etc/bash.bashrc und ~/.bashrc aus, sofern diese Dateien vorhanden sind.
~/.bashrc
Wird also nur für interaktive Shells als Quelle verwendet. Manchmal wird es von ~/.bash_profile
oder als Quelle verwendet ~/.profile
, was falsch ist, da es das erwartete Verhalten beeinträchtigt. Wenn Sie die Wartung von gemeinsamem Code vereinfachen möchten, sollten Sie eine separate Datei verwenden, die den gemeinsamen Code enthält, und ihn unabhängig von beiden RC-Dateien als Quelle verwenden.
rc
Am besten ist es, wenn von Anmeldedateien wie ~/.bash_profile
oder keine Ausgabe an die Standardausgabe erfolgt, da dies beispielsweise ~/.profile
den ordnungsgemäßen Betrieb von beeinträchtigen kann .rsync
In jedem Fall ist es dennoch eine gute Idee, die Interaktivität zu testen, da möglicherweise eine falsche Konfiguration vorliegt.
Antwort2
Das test
Tool kann dies überprüfen (aus der Manpage):
-t FD True if FD is opened on a terminal.
Sie können beispielsweise Folgendes verwenden:
if [ -t 0 ] ; then
echo stdin is a terminal
.....
fi
oder
if [ -t 1 ] ; then
echo stdout is a terminal
fi
Antwort3
Verwenden:
if tty -s; then echo interactive; fi
Antwort4
So macht es Red Hat ... Ich schätze, das ist der schnellste Weg ...
if [ "${-#*i}" == "$-" ]; then
Das heißt: Holen Sie sich die Bash-Parameter, entfernen Sie die kürzeste mögliche Teilzeichenfolge und gleichen Sie alles zwischen dem Anfang und i ab. Überprüfen Sie dann, ob es mit den ursprünglichen Bash-Parametern übereinstimmt.
Überprüfen Sie, ob Sie Ihre Aufgabe erledigt haben, indem Sie sich per SFTP mit dem Benutzer verbinden. Dies schlägt fehl, wenn nicht interaktive Sitzungen Ausgaben haben