Frage Wie kann ich bash einchecken, wenn eine Shell im interaktiven Modus läuft?


Wie kann ich sagen (in ~/.bashrc) wenn ich im interaktiven Modus laufe, oder, sagen wir, einen Befehl über ssh ausführen. Ich möchte das Drucken von ANSI-Escape-Sequenzen vermeiden .bashrc wenn es das letztere ist.


40
2018-05-30 23:53


Ursprung


Die Auswahl, ob Escape-Sequenzen gedruckt werden sollen oder nicht, basiert besser auf dem $ TERM-Wert und nicht auf der Interaktivität der Shell. Die Variable identifiziert Fähigkeiten des Client-Endgeräts, das der Teil ist, der die Escape-Sequenzen interpretiert. - yarek


Antworten:


Gemäß man bash:

PS1 ist gesetzt und $ - beinhaltet i wenn Bash interaktiv ist, erlaubt          ein Shell-Skript oder eine Startdatei, um diesen Status zu testen.

So können Sie verwenden:

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

Ebenfalls:

Wenn eine interaktive Shell gestartet wird, die keine Login-Shell ist, bash          liest und führt Befehle aus /etc/bash.bashrc und ~ / .bashrc, wenn          Diese Dateien existieren.

So ~/.bashrc wird nur für interaktive Shells bereitgestellt. Manchmal beziehen Leute es von ~/.bash_profile oder ~/.profile was falsch ist, da es das erwartete Verhalten stört. Wenn Sie die Wartung von häufig verwendetem Code vereinfachen möchten, sollten Sie eine separate Datei verwenden, um den allgemeinen Code zu enthalten und ihn unabhängig von beiden RC-Dateien zu beziehen.

Es ist am besten, wenn es keine Ausgabe von der Anmeldung nach stdout gibt rc Dateien wie ~/.bash_profile oder ~/.profile da es den ordnungsgemäßen Betrieb stören kann rsync zum Beispiel.

In jedem Fall ist es immer noch eine gute Idee, auf Interaktivität zu testen, da eine falsche Konfiguration vorhanden sein kann.


44
2018-05-31 00:08



Beachten Sie, dass $ - kann enthalten ein ich, nicht unbedingt gleich. ich benutze [[ $- =~ i ]] && echo interactive - Alex Howansky
@AlexHowansky: Die Sternchen im Gleichheitstest machen es zu einem Test für die Aufnahme i - Dennis Williamson
Oh, wow, habe diese nicht einmal bemerkt, sie sehen aus wie doppelte Anführungszeichen auf meinem Monitor. Es kann Zeit sein, die Schriftgröße zu erhöhen. <alt werden> - Alex Howansky
Manchmal beziehen Leute es von ~/.bash_profile oder ~/.profile was falsch ist, da es das erwartete Verhalten stört Recht. Was denkst du über Sourcing? ~/.bashrc von ~/.bash_login? Da die Login-Shell nicht interaktiv sein muss, denke ich, dass sie auch falsch ist. - Piotr Dobrogost
@PiotrDobrogost: Das ist ein Ausgezeichnet Diskussion von Shell-Startdateien. - Dennis Williamson


Benutzen:

if tty -s; then echo interactive; fi

11
2018-06-03 10:50



Scheint nicht zu funktionieren - Steven Shaw
das scheint mir auch nicht zu funktionieren, ich denke das ist die richtige antwort: stackoverflow.com/a/49064632/1223975 - Alexander Mills
Dies prüft auf Vorhandensein eines TTY auf Standardeingabe; obwohl es verwandt sein kann, aber es ist nicht dasselbe wie der interaktive Modus der Shell, der durch das Flag "-i" der Shell angezeigt wird. - yarek


das test Tool kann dies überprüfen (von der man-Seite):

 -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

8
2018-02-02 13:12



Nett und scheint zwischen Schalen beweglich zu sein. Probier es aus bash <<< 'test -t 0 && echo Y || echo X' schreibt Y, bash -c 'test -t 0 && echo Y || echo X' schreibt X - kyb
Dies bestätigt auch, dass die Standardeingabe eine TTY ist; obwohl es verwandt sein kann, aber es ist NICHT das selbe wie der interaktive Modus der Schale, der angefordert wird und durch shell "-i" Markierungsfahne angezeigt wird. - yarek


Normalerweise schaue ich auf die Ausgabe des Programms tty.

Wenn Sie auf einem Gerät sind, wird es Ihnen sagen, auf welchem ​​Gerät Sie sind. Wenn Sie nicht im interaktiven Modus sind, wird es normalerweise etwas wie "nicht ein tty" sagen.


6
2018-05-30 23:54



tty -s wird einen Rückgabewert von 0 setzen, wenn Sie sich auf einem Terminal befinden, oder 1, ohne Ihnen eine Ausgabe zu geben. Sie können es als 'if tty -s; dann _interaktiv; fi ' - BillThor
Vielen Dank! Es war ein lange Zeit, seit ich so etwas tun musste und ich habe einige Details vergessen ... - chris