Je veux savoir s'il existe un moyen de mettre l'esperluette dans une variable tout en l'utilisant pour envoyer un processus en arrière-plan.
Cela marche:
BCKGRND=yes
if [ "$BCKGRND" = "yes" ]; then
sleep 5 &
else
sleep 5
fi
Mais ne serait-ce pas cool d'accomplir ces cinq lignes avec une seule? Ainsi:
BCKGRND='&'
sleep 5 ${BCKGRND}
Mais ça ne marche pas. Si BCKGRND n'est pas défini, cela fonctionne - mais lorsqu'il est défini, il est interprété comme un «&» littéral et les erreurs sont supprimées.
bash
shell-script
variable
background-process
BrowncoatOkie
la source
la source
echo $!
retourne le PIDRéponses:
Il n'est pas possible d'utiliser une variable pour mettre en arrière-plan l'appel, car l'expansion des variables se produit après que la ligne de commande a été analysée pour les opérateurs de contrôle (tels que
&&
et&
).Une autre option serait d'encapsuler les appels dans une fonction:
... puis définissez la variable selon vos besoins:
la source
ed
? +1 de toute façon, c'est la solution la plus propre.Vous pouvez inverser les choses et variabiliser le «premier plan»:
Définissez
FOREGROUND
surtrue
ou vide pour exécuter le processus en arrière-plan. (Le réglageFOREGROUND
detrue
s'exécuter en arrière-plan est certes déroutant! Les noms de variables appropriés sont laissés à la discrétion du lecteur.)la source
set -m
été utilisé).Vous devrez probablement utiliser
eval
:eval
oblige le shell à réévaluer les arguments donnés. Un littéral&
serait donc interprété comme&
à la fin d'une commande et non comme un argument de la commande, mettant la commande en arrière-plan.la source
eval
doit contenir un avertissement, que cela doit être manipulé avec soin. Voir par exemple cette réponse ."$BCKGRND"
évaluation d'un argument vide.eval
joindra ses arguments avec des espaces avant de faire l'évaluation réelle. Il suffit de l' essayer:eval printf "'{%s}\n'" foo "" "" ""
.eval foo "" "" "" ""
est complètement similaire àeval foo
, peu importe quoiIFS
ou autre chose.eval 'sleep $TIMEOUT' "$BACKGROUND"
. Sinon, vous pourriez obtenir des extensions doubles si la variable se développe en une autre variable ou contient des caractères spéciaux. En outre, les citations imbriquées peuvent devenir délicates.