La substitution de commande permet de remplacer la sortie d'une commande à la place du nom de commande lui-même. La substitution de commande doit avoir lieu lorsque la commande est incluse comme suit:
$(command)
ou (version rétrospective):
`command`
Le shell étendra la substitution de commande
en exécutant la commande dans un environnement de sous-shell (voir Environnement d'exécution du shell ) et en remplaçant la substitution de commande (le texte de la commande plus le "$ ()" ou les guillemets) par la sortie standard de la commande, en supprimant séquences d'un ou plusieurs <newline>
caractères à la fin de la substitution. Les <newline>
caractères incorporés avant la fin de la sortie ne doivent pas être supprimés; cependant, ils peuvent être traités comme des délimiteurs de champ et éliminés lors de la division de champ, en fonction de la valeur de IFS et de la cotation en vigueur. Si la sortie contient des octets nuls, le comportement n'est pas spécifié.
Dans le style de substitution de commande entre guillemets, <backslash>
conservera sa signification littérale, sauf s'il est suivi de: « $
», « `
» ou
<backslash>
. La recherche du backquote correspondant doit être satisfaite par le premier backquote non échappé sans guillemets; pendant cette recherche, si un retour arrière non échappé est rencontré dans un commentaire de shell, un document ici, une substitution de commande intégrée de la forme $ ( commande ) ou une chaîne entre guillemets, des résultats indéfinis se produisent. Une chaîne entre guillemets simples ou doubles qui commence, mais ne se termine pas, dans la `...`
séquence " " produit des résultats non définis.
Avec le formulaire $ ( command ), tous les caractères suivant la parenthèse ouverte jusqu'à la parenthèse fermante correspondante constituent la
commande . Tout script shell valide peut être utilisé pour la commande , à l'exception d'un script composé uniquement de redirections qui produit des résultats non spécifiés.
Les résultats de la substitution de commande ne doivent pas être traités pour une extension supplémentaire du tilde, une extension de paramètre, une substitution de commande ou une extension arithmétique. Si une substitution de commande se produit entre guillemets doubles, la division de champ et le développement du chemin ne doivent pas être effectués sur les résultats de la substitution.
La substitution de commande peut être imbriquée. Pour spécifier l'imbrication dans la version avec guillemets inversés, l'application doit précéder les guillemets intérieurs avec des <backslash>
caractères; par exemple:
\`command\`
La syntaxe du langage de commande shell présente une ambiguïté pour les extensions commençant par "$((
", qui peut introduire un développement arithmétique ou une substitution de commande qui commence par un sous-shell. Le développement arithmétique a la priorité; autrement dit, le shell doit d'abord déterminer s'il peut analyser le développement comme un développement arithmétique et ne doit analyser le développement que comme une commande substitution s'il détermine qu'il ne peut pas analyser le développement en tant que développement arithmétique. Le shell n'a pas besoin d'évaluer les développements imbriqués lors de cette détermination. S'il rencontre la fin de l'entrée sans avoir déjà déterminé qu'il ne peut pas analyser le développement comme un développement arithmétique, le shell doit traiter l'expansion comme une expansion arithmétique incomplète et signaler une erreur de syntaxe. Une application conforme doit s'assurer qu'elle sépare le " $(
" et le '(
'en deux jetons (c'est-à-dire, séparez-les par un espace blanc) dans une substitution de commande qui commence par un sous-shell. Par exemple, une substitution de commande contenant un seul sous-shell pourrait être écrite comme suit:
$( (command) )
$()
est POSIX et supporté par tous les shells Bourne modernes, par exemple ksh, bash, ash, dash, zsh, busybox, vous l'appelez. (Un pas si moderne est Solaris/bin/sh
, mais sur Solaris, vous vous assurez d'utiliser le moderne à la/usr/xpg4/bin/sh
place).