web-dev-qa-db-fra.com

Quelle est la différence entre $ (stuff) et `stuff`?

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?

270
tshepang

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:

  • Difficile à remarquer: I like $(program) better than `program`
  • Se confond facilement avec une seule citation: '`'`''`''`'`''`'
  • Pas si facile à taper (peut-être même pas sur la disposition standard du clavier)

(et SE utilise ` ` à ses propres fins, ce fut pénible d'écrire cette réponse :)

364
wag

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.

41
balki

$() 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.

28
mouviciel

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".

6
cuonglm

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.)

5
phk

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 \\\`\``
1
Emmanuel