#!/bin/bash
function0()
{
local t1=$(exit 1)
echo $t1
}
function0
echo
affiche la valeur vide. J'esperais:
1
Pourquoi la t1
variable n'est-elle pas affectée à la valeur de retour de la commande exit - 1
?
bash
shell
variable
command-substitution
Gilles, arrête de faire le mal
la source
la source
$(trap 'printf "::ERRNO:$?"' 0; # now do whatever however
Le code de sortie a été stocké dans $? variable. En utilisant uniquement les commandes de substitution pour capturer la sortie, vous devez utiliser (...) pour créer un sous - shell :
la source
t1=$?
est de l'utiliser, non? et ne serait pas$?
obstrué par l'opération cession? Je suppose que je demande si cela ne devrait pas êtreprintf '%d\n' "${t1}"
Dans
bash
cela fonctionne:Cela concerne l'ordre d'évaluation des commandes et l'affectation des variables.
local
a une valeur de retour qui lui est propre - et il s’agit de la commande en cours d’exécution, pas de la substitution de commande. La raison pour laquelle les choses aiment ...... may return 1 est parce qu'il n'y a jamais de retour dans cette commande, à l'exception du sous-shell exécuté pour affecter
$x
la valeur, de manière à$?
ne pas être bouleversé, comme c'est le cas dans pratiquement tous les autres cas dans lesquels des substitutions de commandes sont utilisées.Quoi qu'il en soit, avec
local
elle ne faussés - mais si vous attrapez juste au bon moment - qui est alors que les extensions sont encore en cours d' évaluation et avantlocal
les routines « ont une chance de écraserait - vous pouvez affecter encore.... des impressions ...
Vous devez savoir cependant que dans de nombreux obus, vous ne pouvez pas compter sur
$?
une évaluation à mi-parcours de cette manière. En fait, c'est probablement parce que ces coquilles ne se donnent pas la peine de réévaluer à tout moment, comme peutbash
- être , ce qui, à mon avis, est probablement meilleur quebash
le s. Voulez-vous vraiment que votre interprète évalue de manière récursive les valeurs d'évaluation de boucle qui risquent très fort d'être écrasées avant que vous n'ayez la chance de les utiliser?Quoi qu'il en soit, c'est comme ça que vous pouvez faire ça.
la source
En fonction de la raison pour laquelle vous essayez d’obtenir le code de sortie, vous pouvez également exécuter une opération
if some-command; then echo "Success $?"; else echo "Failure $?"; fi
qui ne fait rien avec le résultat de la commande. Elle évalue simplement le code de sortie de la commande exécutée. Vous pouvez ajouteror
(or
$ (around the command and you'll still get the same results. A better example might be
si grep -q 'somestring' un fichier; puis echo "le code de sortie trouvé est $?"; Sinon "vous n'avez pas trouvé le code de sortie est $?"; Fi`.Vous pouvez également tester le code de retour d'une fonction qui peut être un
return 3
code de retour explicite ou implicite qui est le résultat de la dernière commande. Dans ce cas, vous devez faire attention à ce que vous n'ayez pas deecho
fin à la fin. fonction, sinon il masque / réinitialise le code de sortie précédent.Enfin, un truc sale car vous ne pouvez pas le faire
VAR=(SOME_COMMAND)
car ilVAR=()
s’agit d’une définition de tableauVAR=( $(echo 'Some value') )
.la source