Il existe deux syntaxes pour la substitution de commandes: avec des parenthèses dollar et avec des astuces. Exécution de top -p $(pidof init)
et top -p `pidof init`
donne la même sortie. Ces deux façons de faire sont-elles la même chose ou y a-t-il des différences?
Les guillemets à l'ancienne ` `
Traitent les contre-obliques et l'imbrication un peu différemment. La nouvelle fonction $()
interprète tout ce qui se trouve entre ( )
Comme une commande.
echo $(uname | $(echo cat))
Linux
echo `uname | `echo cat``
bash: command substitution: line 2: syntax error: unexpected end of file
echo cat
fonctionne si les guillemets imbriqués sont échappés:
echo `uname | \`echo cat\``
Linux
amusement antislash:
echo $(echo '\\')
\\
echo `echo '\\'`
\
Le nouveau style $()
s'applique à tous les shells conformes POSIX -.
Comme mouviciel l'a souligné, l'ancien modèle ` `
Peut être nécessaire pour les anciens shell.
Outre le point de vue technique, l'ancien style ` `
Présente également un inconvénient visuel:
I like $(program) better than `program`
'`'`''`''`'`''`'
(et SE utilise ` `
à ses propres fins, ce fut pénible d'écrire cette réponse :)
La différence évidente que j'observe est que vous ne pouvez pas imbriquer de backticks alors que vous pouvez imbriquer $()
. Peut-être que les deux existent pour des raisons héritées. De même, le .
et source
sont des synonymes.
$()
ne fonctionne pas avec l'ancien Bourne Shell. Mais il a été années décennies depuis que j'ai travaillé avec le vieux Bourne Shell.
Une autre note, $()
utilisera plus de ressources système que l'utilisation de backticks, mais est légèrement plus rapide.
Dans Mastering Unix Shell scripting , Randal K. Michael avait fait un test dans un chapitre intitulé "24 façons de traiter un fichier ligne par ligne".
Pour ajouter à ce que les autres ont dit ici, vous pouvez utiliser les astuces pour simuler des commentaires en ligne:
echo foo `# I'm a comment!` bar
La sortie est: foo bar
.
Voir ce qui suit pour plus d'informations: https://stackoverflow.com/a/12797512 (Notez également les commentaires sous ce post.)
La syntaxe $()
ne fonctionnera pas avec l'ancien shell bourne.
Avec les shells plus récents, ` `
Et $()
sont équivalents mais $()
est beaucoup plus pratique à utiliser lorsque vous devez imbriquer plusieurs commandes.
Par exemple :
echo $(basename $(dirname $(dirname /var/adm/sw/save )))
est plus facile à taper et à déboguer que:
echo `basename \`dirname \\\`dirname /var/adm/sw/save \\\`\``