2012-10-21 10 views
29

Ich versuche, mein Benachrichtigungsskript zu verbessern. Die Art, wie das Skript funktioniert, ist, dass ich es hinter einen lang laufenden Shell-Befehl stelle und dann alle Arten von Benachrichtigungen aufgerufen werden, nachdem das lange laufende Skript beendet wurde.Exit-Code des letzten Shellbefehls in einem anderen Skript abrufen

Zum Beispiel:

sleep 100; my_notify 

Es wäre schön, den Exit-Code des langen laufenden Skript zu bekommen, ist das Problem, dass my_notify auffordert, einen neuen Prozess erstellt, der den Zugriff auf den $? Variable nicht hat.

vergleichen:

~ $: ls nonexisting_file; echo "exit code: $?"; echo "PPID: $PPID" 
ls: nonexisting_file: No such file or directory 
exit code: 1 
PPID: 6203 

gegen

~ $: ls nonexisting_file; my_notify  
ls: nonexisting_file: No such file or directory 
exit code: 0 
PPID: 6205 

Das my_notify Skript folgendes in sich hat:

#!/bin/sh 
echo "exit code: $?" 
echo "PPID: $PPID" 

ich nach einer Möglichkeit, den Exit-Code zu bekommen, der vorherige Befehl, ohne die Struktur des Befehls zu sehr zu ändern. Ich bin mir der Tatsache bewusst, dass, wenn ich es zum Arbeiten mehr wie time, z. my_notify longrunning_command... mein Problem wäre gelöst, aber ich mag es tatsächlich, dass ich es am Ende eines Befehls heften kann und ich befürchte Komplikationen dieser zweiten Lösung.

Kann dies getan werden oder ist es grundsätzlich nicht kompatibel mit der Funktionsweise von Shells?

Meine Shell ist zsh, aber ich möchte es auch mit bash arbeiten.

Antwort

31

Sie müssten wirklich eine Shell-Funktion verwenden, um dies zu erreichen. Für ein einfaches Skript wie dieses sollte es ziemlich einfach sein, es sowohl in zsh als auch in bash zu haben. Platzieren Sie Folgendes in eine Datei:

my_notify() { 
    echo "exit code: $?" 
    echo "PPID: $PPID" 
} 

Dann Quelle diese Datei von Ihrer Shell Startdateien. Obwohl dies von Ihrer interaktiven Shell aus erfolgen würde, möchten Sie vielleicht lieber $$ als $ PPID verwenden.

6

Es ist nicht kompatibel. $?Nur existiert innerhalb der aktuellen Shell; Wenn Sie es in Unterprozessen verfügbar machen möchten, müssen Sie es in eine Umgebungsvariable kopieren.

Die Alternative besteht darin, eine Shell-Funktion zu schreiben, die sie stattdessen verwendet.

2

Eine Methode, dies zu implementieren, könnte die Verwendung eines EOF-Tags und eines Hauptskriptes sein, das Ihr my_notify-Skript erstellt.


#!/bin/bash 

if [ -f my_notify ] ; then 
rm -rf my_notify 
fi 

if [ -f my_temp ] ; then 
rm -rf my_temp 
fi 

retval=`ls non_existent_file &> /dev/null ; echo $?` 
ppid=$PPID 
echo "retval=$retval" 
echo "ppid=$ppid" 
cat >> my_notify << 'EOF' 
#!/bin/bash 

echo "exit code: $retval" 
echo " PPID =$ppid" 
EOF 

sh my_notify 

Sie können dieses Skript für Ihre Zwecke verfeinern.

Verwandte Themen