Quest-ce que la substitution de commandes dans un shell? [dupliquer]

Cette question a déjà des réponses ici :

Commentaires

  • OK, tout le monde doit se détendre et cesser de s’accuser de trolling. Si vous naimez pas ' une question, alors votez contre ou ignorez-la et éloignez-vous . Si vous pensez que vous ' êtes attaqué dans les commentaires, ne vous engagez pas mais signalez et éloignez-vous .
  • Également lié: Quelle ' est la différence entre $ (stuff) et `stuff`?
  • Affichage du la sortie dune commande utilisant la substitution de commande et 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 écrit date | sed 's/^/Today is /'
  • @Kusalananda Je vois votre point de limprimer immédiatement (avec printf ) est inutile. Jai un peu changé la formulation, de immédiatement à sometime later, est-ce plus attrayant?
  • Lexemple pourrait être thedate=$(date), suivi de printf 'The date is %s\n' "$thedate".

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.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *