Überprüfen Sie, ob das Bash-Skript von einer Shell oder einem anderen Skript / Anwendung aufgerufen wurde

8

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?

    
Sander Marechal 23.11.2010, 22:55
quelle

4 Antworten

16

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 :

%Vor%

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.

    
Dennis Williamson 23.11.2010, 23:29
quelle
7

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%     
thkala 23.11.2010 23:29
quelle
1

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.

%Vor%     
Rhongomiant 09.03.2012 03:33
quelle
-1

Sie könnten $ PPID

verwenden

Etwas wie

%Vor%

Dies würde die Variable PARENT auf den Prozessnamen des Elterns setzen und dann auf den Bildschirm drucken.

Sie könnten dann einige if-Anweisungen basierend auf dem Wert von $ PARENT

setzen

HTH

    
laher 23.11.2010 23:17
quelle

Tags und Links