Gibt es einen Standard-Unix-Befehl, der ähnlich wie im folgenden Beispiel funktioniert?
$ <cmd here> 56
$ echo Return code was $?
Return code was 56
$
<cmd here>
sollte etwas sein, das vom Fork ausgeführt werden kann und beim Beenden des Prozesses 56 als Exit-Code belässt. Die exit
und return
Shell Builtins sind für das, wonach ich suche, ungeeignet, da sie die aufrufende Shell selbst beeinflussen, indem sie sie verlassen. <some cmd>
sollte etwas sein, das ich in Nicht-Shell-Kontexten ausführen kann - z. B. über ein Python-Skript mit aufrufen subprocess
.
ZB wird /usr/bin/false
immer sofort mit dem Rückkehrcode 1 beendet, aber ich möchte genau steuern, was dieser Rückkehrcode ist. Ich könnte die gleichen Ergebnisse erzielen, indem ich mein eigenes Wrapper-Skript schreibe
$ cat my-wrapper-script.sh # i.e., <some cmd> = ./my-wrapper-script.sh
#!/usr/bin/bash
exit $1
$ ./my-wrapper-script.sh 56
$ echo $?
56
Ich hoffe jedoch, dass es einen Standard-Unix-Befehl gibt, der dies für mich erledigen kann.
quelle
exit
ist die einzige, an die ich denken kann, aber es neigt dazu, deine Muschel zu beenden.bash -c 'exit 56'
oderbash -c "exit $1"
könnte für Sie arbeiten.(exit 56)
?true
undfalse
eingebauten, wenn Sie 0 oder 1 zurückgeben müssen.Antworten:
Eine
return
basierende Funktion würde funktionieren und das Öffnen und Schließen einer anderen Shell vermeiden (laut Tim Kennedys Kommentar ):Ausgabe:
Verwenden
exit
in einer Unterschale:Bei anderen Schalen bedeutet dies
ksh93
, dass ein zusätzlicher Prozess erforderlich ist, der weniger effizient ist als der oben beschriebene.bash
/zsh
/ksh93
Nur Trick:(das impliziert auch einen zusätzlichen Prozess (und IPC mit einer Pipe)).
zsh
Lambda-Funktionen von:quelle
<some cmd>
eine ausführbare () - fähige Sache ist./bin/sh -c ...originalcommand...
Es gibt keinen Standard-UNIX-Befehl, um nur einen bestimmten Wert zurückzugeben. Die GNU Core Utilies bieten
true
undfalse
nur.Sie können dies jedoch problemlos selbst implementieren als
ret
:Kompilieren:
Und Renn:
Drucke:
Wenn dies überall funktionieren soll (wo bash verfügbar ist), ohne zusätzliche Tools zu installieren, müssen Sie wahrscheinlich den folgenden Befehl verwenden, wie in den Kommentaren von @TimKennedy vorgeschlagen:
Beachten Sie, dass der gültige Bereich der Rückgabewerte 0..255 ist .
quelle
true
undfalse
sind auch in Unix (und sogar POSIX), nicht nur in GNU.Wenn Sie den Exit-Status durch einen ausgeführten Befehl setzen möchten. Es gibt keinen dedizierten Befehl für diese 1 , aber Sie können den Interpreter jeder Sprache verwenden, die die Fähigkeit hat, mit einem beliebigen Beendigungsstatus zu beenden.
sh
ist das offensichtlichste:Bei den meisten
sh
Implementierungen ist dies auf die Beendigungscodes 0 bis 255 beschränkt (sh
akzeptiert höhere Werte, schneidet sie jedoch möglicherweise ab oder bewirkt sogar, dass ein Signal an den Prozess gesendet wird, dersh
wie bei ksh93 für die Codes 257 bis 320 ausgeführt wird).Ein Exit-Code kann ein beliebiger Integer (
int
) - Wert sein. Beachten Sie jedoch, dass Sie ihn mit derwaitid()
Schnittstelle abrufen müssen, damit der Wert nicht auf 8 Bit gekürzt wird (unter Linux wird er jedoch auch weiterhin gekürztwaitid()
). Daher ist es selten (und keine gute Idee), Exit-Codes über 255 zu verwenden (verwenden Sie 0-123 für den normalen Betrieb).Alternative:
(Diese kürzen den Exit-Code nicht auf 8 Bit).
Mit NetBSD
find
können Sie:1
exit
ist der Standardbefehl, um dies zu tun. Da es sich jedoch um ein spezielles Shell- Builtin handelt , ist es nicht erforderlich, dass das Dateisystem einen Befehl mit diesem Namen enthält, wie dies bei regulären Builtins der Fall ist, und die meisten Systeme enthalten keinenquelle
Speichern Sie dies in einer Datei mit dem Namen
returncode.c
undgcc -o returncode returncode.c
quelle
argv[argc-1]
stattdessen verwendenargv[1]
und warum Sie sich nicht beschweren, wennargc>2
. (2) Ich wäre geneigt, denargv[1]
Test vor demargv[0]
Test durchzuführen, wobei der Benutzer sagen kann,true 56
oderfalse 56
anstelle vonreturncode 56
. Sie geben keine Nachricht, wennargv[0]
ein Wort ist undargc>0
- das könnte verwirrend sein. (3) Ich bin besessen von Benutzerfreundlichkeit, also würde ichstrcasecmp
anstelle von verwendenstrcmp
. (4) Ich neige dazu, Parameter zu validieren und den Rückgabewert von nicht zu verwenden,atoi
ohne ihn zu verifizieren. Für ein 2 ¢ -Programm wie dieses ist es wohl egal.true
nochfalse
verarbeitet jedes Argument in Linux - Systemenargv[0]
; die Programme/bin/true
und/bin/false
sind verschiedene ausführbare Dateien, mit fest codierten Exit-Codes. Sie haben ein Programm geschrieben , das als installiert werden kann beidetrue
undfalse
(verbunden), die klug ist. In der Frage wird jedoch gefragt, wie ein benutzerdefinierter Beendigungsstatus abgerufen werden kann. Ihr Programm beantwortet diese Frage nur, wenn es unter einem anderen Dateinamen installiert ist. Solange Sie esargv
trotzdem betrachten, glaube ich, dass es das Niveau der Klugheit bewahren würde, wenn Sie es so tun, wie ich es vorschlage, indem Sie die Notwendigkeit eines dritten Links vermeiden.Ich war mir nicht ganz sicher, ob Ihr einziges Problem mit dem
exit
Befehl darin bestand, die aktuelle Shell zu verlassen, aber in diesem Fall könnte eine Subshell funktionieren.Ich habe das gerade auf Cygwin Bash getestet und es funktioniert für mich.
Bearbeiten: Sorry, ich habe den Teil verpasst, der außerhalb eines Shell-Kontexts ausgeführt wurde. In diesem Fall würde dies nicht helfen, ohne es in ein
.sh
Skript zu packen und dieses in Ihrer Umgebung auszuführen.quelle
$(exit 42)
versucht die Ausgabe vonexit 42
als einfachen Befehl auszuführen , was wenig Sinn macht (es würde auch nicht funktionierenyash
).(exit 42)
(exit
Wird auch in einer Subshell ausgeführt, lässt aber die Ausgabe in Ruhe) wäre sinnvoller und portabler (sogar für csh oder die Bourne-Shell).