Wie kann ich in Bash überprüfen, ob eine Shell im interaktiven Modus ausgeführt wird?

Wie kann ich in Bash überprüfen, ob eine Shell im interaktiven Modus ausgeführt wird?

Wie kann ich (in ) feststellen, ob ich im interaktiven Modus arbeite oder beispielsweise einen Befehl über SSH ausführe? In letzterem Fall ~/.bashrcmö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.

~/.bashrcWird also nur für interaktive Shells als Quelle verwendet. Manchmal wird es von ~/.bash_profileoder 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.

rcAm besten ist es, wenn von Anmeldedateien wie ~/.bash_profileoder keine Ausgabe an die Standardausgabe erfolgt, da dies beispielsweise ~/.profileden 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 testTool 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

verwandte Informationen