224 votes

Quel est l'avantage d'utiliser $() au lieu de backticks dans les scripts shell?

Il y a deux façons de capturer la sortie de ligne de commande de bash:

  1. L'héritage de Bourne shell backticks:

     var=`command`
    
  2. syntaxe $ () (qui, autant que je sais, c'est Bash spécifique)

     var=$(command)
    

Est-il un avantage à l'utilisation de la deuxième syntaxe par rapport à backticks? Ou sont les deux à 100% équivalent?

216voto

paxdiablo Points 341644

Le plus important est la capacité de nid , les commandes à l'intérieur de commandes, sans perdre votre santé mentale à essayer de comprendre si une certaine forme de s'en échapper, va travailler sur les backticks.

Un exemple, même si un peu artificiel:

deps=$(find /dir -name $(ls -1tr 201112[0-9][0-9]*.txt | tail -1l) -print)

qui vous donnera une liste de tous les fichiers dans l' /dir arborescence de répertoires qui ont le même nom que la première, datée du fichier texte à partir de décembre 2011 (a).

Un autre exemple serait quelque chose comme obtenir le nom (pas le chemin d'accès complet) du répertoire parent:

pax> cd /home/pax/xyzzy/plugh
pax> parent=$(basename $(dirname $PWD))
pax> echo $parent
xyzzy

(a) Maintenant que spécifique de commande ne peut pas réellement le travail, je n'ai pas testé la fonctionnalité. Donc, si vous votez-moi vers le bas pour elle, vous avez perdu de vue le but :-) Il est signifié comme une illustration de la façon dont vous pouvez nid, non pas comme un bug-free prêt à la production de l'extrait de code.

75voto

Jonathan Leffler Points 299946

Supposons que vous voulez trouver le répertoire lib correspondant à l'endroit où gcc est installé. Vous avez le choix:

libdir=$(dirname $(dirname $(which gcc)))/lib

libdir=`dirname \`dirname \\\`which gcc\\\`\``/lib

La première est plus facile que la seconde utilise le premier.

27voto

dgw Points 5118

De man bash:

          $(command)
   or
          `command`

   Bash performs the expansion by executing command and replacing the com-
   mand  substitution  with  the  standard output of the command, with any
   trailing newlines deleted.  Embedded newlines are not deleted, but they
   may  be  removed during word splitting.  The command substitution $(cat
   file) can be replaced by the equivalent but faster $(< file).

   When the old-style backquote form of substitution  is  used,  backslash
   retains  its  literal  meaning except when followed by $, `, or \.  The
   first backquote not preceded by a backslash terminates the command sub-
   stitution.   When using the $(command) form, all characters between the
   parentheses make up the command; none are treated specially.

11voto

Keith Thompson Points 85120

En plus des autres réponses,

$(...)

se démarque visuellement mieux que

`...`

Backticks ressemblent trop à des apostrophes, ce qui varie selon la police que vous utilisez.

(Et, comme je viens de le remarqué, backticks sont beaucoup plus difficile d'entrer dans le code en ligne des échantillons.)

9voto

shiplu.mokadd.im Points 28895

$() permet de nidification.

out=$(echo today is $(date))

Je pense que backticks ne le permet pas.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X