Commentaires
Réponse
" Substitution de commande " est le nom de la fonctionnalité du langage shell qui vous permet dexécuter une commande et de faire remplacer la sortie de cette commande ( substitute) le texte de la commande.
Il ny a pas dautre fonctionnalité du langage shell qui vous permet de faire cela.
Une substitution de commande, cest-à-dire lensemble $(...)
, est remplacé par sa sortie, qui est la principale utilisation des substitutions de commandes.
La commande exécutée par la substitution de commandes est exécutée dans un sous-shell, ce qui signifie quil a son propre environnement qui naffectera pas lenvironnement du shell parent.
Toutes les exécutions de sous-shell ne sont pas des substitutions de commandes mais ugh (voir dautres exemples à la fin).
Exemple montrant quune substitution de commande est exécutée dans un sous-shell:
$ s=123 $ echo "hello $( s=world; echo "$s" )" hello world $ echo "$s" 123
Ici, le la variable s
est définie sur la chaîne 123
. Sur la ligne suivante, echo
est appelé sur une chaîne contenant le résultat dune substitution de commande. La substitution de commande définit s
sur la chaîne world
et fait écho à cette chaîne. La chaîne world
est la sortie de la commande dans la substitution de commande et donc, si elle a été exécutée sous set -x
, nous verrions que la deuxième ligne ci-dessus aurait été étendue à echo "hello world"
, ce qui produit hello world
sur le terminal:
$ set -x $ echo "hello $( s=world; echo "$s" )" ++ s=world ++ echo world + echo "hello world" hello world
(bash
ajoute un niveau supplémentaire de +
invite à chaque niveau de un sous-shell de substitution de commande dans la sortie de trace, dautres shells peuvent ne pas le faire)
Enfin, nous montrons que la commande à lintérieur de la substitution de commande a été exécutée dans son propre sous-shell, car elle naffectait pas la valeur de s
dans le shell appelant (la valeur de s
est toujours 123
, pas world
).
Il existe dautres situations où des commandes sont exécutées dans des sous-shell, comme dans
echo "hello" | read message
Dans bash
, sauf si vous définissez loption lastpipe
(uniquement dans les instances non interactives), read
est exécuté dans un sous-shell, ce qui signifie que $message
ne sera pas changé dans le shell parent, cest-à-dire que echo "$message"
après la commande ci-dessus fera écho une chaîne vide (ou quelle que soit la valeur div id = « abcfc25141″>
était avant).
Une substitution de processus dans bash
sexécute également dans un sous-shell:
cat < <( echo "hello world" )
Ceci aussi est distinct dune substitution de commande.
Commentaires
- Pour bash 4.2 up, si shopt lastpipe est défini, le contrôle des travaux nest pas actif et le pipeline nest pas en arrière-plan, la dernière commande ne sexécute pas dans un sous-shell.
- Vous dites: « Aucune autre fonctionnalité du langage shell ne vous permet de faire cela. » Eh bien, au risque de vous fendre les cheveux, vous pouvez faire
cmd₁ > myfile
/read -r var < myfile
/cmd₂ "$var"
. Si nécessaire, vous pouvez développer cela pour gérer des données multilignes. - @ G-Man Oui, et vous pouvez également écrire un nouveau script shell dans un fichier et lexécuter.Cependant, il n’existe aucune autre fonctionnalité permettant de remplacer un texte par la sortie d’une commande.
Réponse
a=$(command)
stockera la valeur de résultat de command
dans la variable.
Il ny a vraiment plus rien à faire.
En guise de remarque, je crois que:
a=`command`
est obsolète et a le même sens que ci-dessus.
Commentaires
- résultat voici la sortie standard de la commande dépouillée de tout son retour à la ligne de fin caractères (et quelques variations entre les shells si la sortie nest pas du texte). Notez que
`...`
est la syntaxe Bourne of csh tandis que$(...)
est la syntaxe Korn / POSIX (avec`...`
toujours pris en charge pour la compatibilité descendante) - @St é phaneChazelas Merci pour les informations précieuses, et nhésitez pas à modifier la réponse pour quelle les inclue.
echo
est un mauvais exemple de substitution de commande car 1) la sortie aurait été affichée de toute façon, 2)printf
est plus sûr à utiliser pour les données variables. Lexemple pourrait aussi bien être écritdate | sed 's/^/Today is /'
printf
) est inutile. Jai un peu changé la formulation, de immédiatement àsometime later
, est-ce plus attrayant?thedate=$(date)
, suivi deprintf 'The date is %s\n' "$thedate"
.