Ich schreibe ein Bash-Skript, um die Ausgabe von einem anderen Befehl an den richtigen Ort umzuleiten. Grundsätzlich, wenn das Skript von einer Shell / Kommandozeile aufgerufen wird, möchte ich die Ausgabe an STDOUT senden. Aber wenn das Bash-Skript von einer anderen Anwendung (z. B. einem anderen Bash-Skript, einer Anwendung oder in meinem Fall vom Awesome-Prompt-Plugin in meinem Awesome Window Manager) ausgeführt wird, möchte ich die Ausgabe woanders hinleiten.
Gibt es einen Weg in bash zu sehen, wie ein Skript aufgerufen wurde?
Versuchen Sie Folgendes:
%Vor%Wenn das Ergebnis "s" (Kleinbuchstaben) enthält, wurde es entweder von der Befehlszeile oder von einem Skript aus aufgerufen. Um diese beiden auseinander zu halten:
%Vor%enthält ein "+", wenn es nicht im Hintergrund war.
Hier ist eine Tabelle:
%Vor% Wobei (& amp;) bedeutet, dass das Kindskript im Hintergrund lief und & amp; bedeutet das übergeordnete Skript (auf das sich "Script" bezieht), das ausgeführt wurde, dass es im Hintergrund lief. CL bedeutet Befehlszeile. NULL bedeutet, dass ps eine Null ausgibt und dass $PPID
"1" ist.
Von man ps
:
Es sollte angemerkt werden, dass diese Antwort auf GNU ps
basiert, aber die man-Seiten für BSD (einschließlich OS X) zeigen ähnliche Funktionen an. Und GNU ps
ist ein Hybrid, der unter anderem die BSD-Funktionalität enthält.
Ich glaube, dass Sie wirklich wissen wollen, ob stdout ein Terminal ist oder nicht. Wenn dies der Fall ist, können Sie (fast) sicher davon ausgehen, dass es sich um eine interaktive Sitzung handelt. Probieren Sie das folgende Snippet aus:
%Vor% Der Befehl [[ -t 1 ]]
prüft, ob der Dateideskriptor 1 (d. h. stdout) ein Terminal ist oder nicht.
BEARBEITEN:
Bitte beachten Sie, dass dies ein nicht-terminales Stdout anzeigt, wenn Sie die Ausgabe an ein anderes Programm übergeben. In diesem Fall möchten Sie möglicherweise eine vielseitigere Bedingung, die auch die Standardeingabe (Dateideskriptor 0) überprüft:
%Vor% Dies ist eine Funktion, die ich aus einem anderen Beitrag zu diesem Thema übernommen habe. Es stimmt alle übergeordneten Prozesse bis zum Anfang mit den Elementen überein, die in der Variablen $shells
aufgeführt sind. Wenn es fertig ist, wird $iscli
entweder auf 0 oder 1 gesetzt. Wenn es auf 0 gesetzt ist, dann wissen Sie, dass es von einer Shell aus ausgeführt wurde oder was Sie für diesen Zweck als Shell betrachten. Wenn es auf 1 gesetzt ist, dann wissen Sie, dass ein Programm beteiligt war, das nicht genehmigt wurde. Ich benutze dies für Skripts, die ich in einer Shell ausführen möchte, und über PHP, wenn ich möchte, dass jeder eine andere Ausgabe erhält.
Sie müssen die Funktion natürlich zunächst ohne Parameter aufrufen, bevor Sie $iscli
benötigen, um einen Wert zu erhalten.