Ich habe ein Bash-Skript wie das folgende:
rm ~/sqoop/"$TABLE"/* rmdir ~/sqoop/"$TABLE" return $?
Nach der Ausführung dieses Skripts wird ein Wert für den nächsten Prozess zurückgegeben. Obwohl das Skript erfolgreich ausgeführt wurde und alle Phasen des Skripts erfolgreich abgeschlossen wurden, wird 1 zurückgegeben.
Da dies – der nächste Prozess findet nicht statt.
Wenn ich die return-Anweisung entferne, läuft der nächste Prozess reibungslos ab. Dieses Problem trat nach der Hadoop-Cluster-Up-Abstufung auf, bei der Ubuntu 14 und der neue Cluster Ubuntu 16 haben.
Können Sie uns bitte helfen, das Problem zu verstehen und zu verstehen, wie der nächste Prozess erfolgreich ausgeführt wird, wenn Sie den Befehl return entfernen Hier und was ist die Auswirkung auf die Produktion, wenn die Return-Anweisung entfernt wird?
Kommentare
- Was ist der nächste Schritt? Was genau überprüft der nächste Schritt?
- Der nächste ist HQL (Hive-Abfrage in Hadoop) und es gibt einige Geschäftsschritte, die ausgeführt werden, wenn ich den Rückgabewert kommentiere, der gut funktioniert, aber nicht ausgeführt wird, wenn der Kommentar kommentiert wird Rückkehr. Ich habe ' nichts an der Geschäftslogik / dem Shell-Skript geändert. Das einzige, was wir getan haben, ist ein Upgrade
Antwort
Die Anweisung return
gibt einen Fehler zurück, wenn die Anweisung nicht von einer Funktion ausgeführt wird.
In Shell-Funktionen Verwenden Sie return
. Verwenden Sie in Skripten exit
.
Ein kurzes Skript wie
#!/bin/bash return 0
erzeugt das Fehlermeldung
line 1: return: can only `return" from a function or sourced script
und $?
wird auf 1 gesetzt.
Wenn Sie nicht „Beenden Sie das Skript nicht mit einem expliziten exit
(oder wenn Sie mit exit
beenden, ohne einen Exit-Code anzugeben), dem Rückkehrcode von Das gesamte Skript entspricht dem zuletzt ausgeführten Befehl.
exit "$?"
entspricht dem einfachen exit
, und wenn es am Ende des Skripts steht, kann dies vollständig weggelassen werden.
Im Allgemeinen empfehle ich auch, $HOME
anstatt in Skripten zu tilden. Dies liegt daran, dass $HOME
wie jede andere Variable funktioniert, während Tilde in einem separaten Erweiterungsschritt erweitert wird. Dies bedeutet, dass sie sich nicht als Variable verhält und nicht in Zeichenfolgen in Anführungszeichen erweitert wird . $HOME
ist auch aussagekräftiger. Da es sich um ein Skript handelt, können Sie einige zusätzliche Tastenanschläge ausführen, um den Code besser lesbar zu machen.
Kommentare
- Ich habe eine schnelle Abfrage für über Ihrer Antwort. Ich werde es oben mit exist 0 versuchen, aber ich habe eine Abfrage, warum dieses Problem jetzt nur vorab auftritt. Ich verwende dieselbe Abfrage. Es funktioniert, wenn ich einen Kommentar zurückgebe Anweisung hat dies Auswirkungen?
- @gsrao Wenn Sie die Anweisung
return
auskommentieren, ist der Rückkehrcode des Skripts der des zuletzt ausgeführten Befehls. In Ihrem Fall hier können Sie es also definitiv weglassen. Ich werde dies zu meiner Antwort hinzufügen. - Oh … großartig … Sie retten mein Leben, also mein Fall, wenn ich die Rückgabe standardmäßig kommentiere Das Skript gibt das Flag für den letzten Kommentar erfolgreich zurück (rmdir ~ / sqoop / " $ TABLE "), oder? ich wenn zwei einfache Fragen, die mein Gehirn fressen 1) mein Fall, was ist die Verwendung von " $ zurückgeben? " wie Sie sagten, es wird genauso funktionieren, wenn ich die " return $ kommentiere " 2) Was kann das Problem möglicherweise früher verursachen?
- @gsrao Ja, wenn Sie die
return
(was ' zunächst nicht vorhanden sein sollte, da es ', soweit ich sehen kann, nicht in einer Funktion ist ) ist der Exit-Status des Skripts der vonrmdir
, wenn dieser ' der letzte Befehl im Skript ist. Was Ihre letzte Frage betrifft, verstehe ich ' nicht ganz, was Sie mit " dem Problem früher als jetzt . - Meine letzte Frage … ich verwende dasselbe Skript, das ich vor der Linux / Cluster-Up-Abstufung verwendet habe. Es funktionierte bis zur Cluster-Up-Abstufung. Warum tritt jetzt nur dieses Problem auf? Was könnte die Ursache für dieses Problem sein?