return
habituellement n'accepte aucune option ( ksh93
« accepte de l'habituel --help
, --man
, --author
... cependant). Le seul argument qu'il attend (facultatif) est le code retour. La plage des codes de retour acceptés varie d'un shell à l'autre, et si une valeur en dehors de 0..255 est correctement reflétée, $?
elle varie également d'un shell à l'autre. Voir Code de sortie par défaut à la fin du processus? pour plus de détails à ce sujet.
La plupart des shells acceptent des nombres négatifs (après tout, l'argument passé à l' appel _exit()
/ exitgroup()
system est un int
, donc avec des valeurs englobant au moins -2 31 à 2 31 -1, il est donc logique que les shells acceptent la même plage pour ses fonctions) .
La plupart des obus utilisent le waitpid()
et co. API pour récupérer cet état de sortie, mais dans ce cas, il est tronqué à un nombre compris entre 0 et 255 lorsqu'il est stocké dans $?
. Même si l'invocation d'une fonction n'implique pas la création d'un processus et permet waitpid()
de récupérer son état de sortie car tout se fait dans le même processus, de nombreux shells imitent également ce waitpid()
comportement lors de l'appel de fonctions. Ce qui signifie que même si vous appelez return
avec une valeur négative, $?
contiendra un nombre positif.
Maintenant, parmi les shells dont return
les nombres négatifs sont acceptés (ksh88, ksh93, bash, zsh, pdksh et dérivés autres que mksh, yash), il y en a quelques-uns (pdksh et yash) qui ont besoin de l'écrire return -- -123
comme sinon, cela -123
est pris comme trois -1
, -2
, -3
options invalides.
Comme pdksh et ses dérivés (comme OpenBSD sh
ou posh
) conservent le nombre négatif dans $?
, cela signifie que faire return "$?"
échouerait lorsqu'il $?
contient un nombre négatif (ce qui se produirait lorsque la dernière commande d'exécution était une fonction qui a renvoyé un nombre négatif).
Ce return -- "$?"
serait mieux dans ces coquilles. Cependant, notez que bien qu'elle soit prise en charge par la plupart des shells, cette syntaxe n'est pas POSIX et, en pratique, n'est pas prise en charge par mksh
les dérivés ash.
Donc, pour résumer, avec des shells basés sur pdksh, vous pouvez utiliser des nombres négatifs dans les arguments des fonctions, mais si vous le faites, return "$@"
cela ne fonctionnera pas. Dans d'autres shells, return "$@"
cela fonctionnera et vous devriez éviter d'utiliser des nombres négatifs (ou des nombres en dehors de 0..255) comme arguments pour return
.
return
est que pour les fonctions définies commef() (...; cmd; return)
, cela empêche l'optimisation que quelques shells font de l'exécutioncmd
dans le même processus que le sous-shell. Avec de nombreux shells, cela signifie également que l'état de sortie de la fonction ne porte pas les informations quicmd
ont été tuées quand il l'a fait (la plupart des shells ne peuvent pas récupérer ces informations de toute façon).