web-dev-qa-db-fra.com

Que signifie `(backquote / backtick) dans les commandes?

Je suis tombé sur la commande suivante:

Sudo chown `id -u` /somedir

et je me demande: quel est le sens du ` symbole. J'ai remarqué par exemple que bien que la commande ci-dessus fonctionne bien, celle ci-dessous ne fonctionne pas:

Sudo chown 'id -u' /somedir
189
gws

Il s'agit d'un backtick . Un backtick n'est pas un signe de citation. Il a une signification très spéciale. Tout ce que vous saisissez entre les backticks est évalué (exécuté) par le Shell avant la commande principale (comme chown dans vos exemples), et la sortie de cette exécution est utilisée par cette commande , comme si vous tapiez cette sortie à cet endroit dans la ligne de commande.

Et alors

Sudo chown `id -u` /somedir

fonctionne efficacement (en fonction de votre ID utilisateur) est:

Sudo chown 1000 /somedir
  \    \     \     \
   \    \     \     `-- the second argument to "chown" (target directory)
    \    \     `-- your user ID, which is the output of "id -u" command
     \    `-- "chown" command (change ownership of file/directory)
      `-- the "run as root" command; everything after this is run with root privileges

Jetez un oeil à cette question pour savoir pourquoi, dans de nombreuses situations, ce n'est pas une bonne idée d'utiliser des astuces.

Btw, si vous avez déjà voulu utiliser un backtick littéralement, par exemple dans une chaîne, vous pouvez y échapper en plaçant une barre oblique inverse (\) avant cela.

231
rozcietrzewiacz

Je voudrais ajouter quelques points supplémentaires ici.

Le backtick `…` Est en fait appelé substitution de commande . Le but de la substitution de commande est d'évaluer la commande qui est placée à l'intérieur du backtick et de fournir son résultat comme argument à la commande réelle.

La substitution de commande peut être effectuée de deux manières: l'une utilise $(…) et l'autre est `…`. Les deux fonctionnent de la même façon, mais la forme $(…) est la méthode moderne et a plus de clarté et de lisibilité.

Et donc

Sudo chown $(id -u) /somedir

peut être préféré à l'autre.

Et une autre chose que vous devez noter ici est la relation substitution de commande avec les règles de citation bash comme mentionné dans la bash document .

Si la substitution apparaît entre guillemets, le fractionnement de Word et l'expansion de nom de fichier ne sont pas effectués sur les résultats.

73
Kannan Mohan

Une note de clarification rarement abordée:

Les backticks (parfois aussi appelés Graves car ils se doublent d'un accent commun en français et dans d'autres langues) remplacent le sortie standard uniquement, mais pas l'erreur standard.

Donc, pour continuer l'exemple précédent:

file `which hostname`

fonctionnera comme prévu, mais en:

file `which hostnameX`

which renverra une erreur, et cette sortie ira à l'erreur standard, plutôt que de se substituer à la ligne de commande à côté de file; il n'y aura aucune sortie standard du tout, ce que vous pouvez confirmer en exécutant:

which hostnameX

which hostnameX 2>/dev/null

Dans ce cas,

file `which hostnameX` 

produira deux messages d'erreur (le premier, dû à which hostnameXet le second juste après le premier, en raison du fichier lui-même, qui constate que le nom du fichier est manquant et donc, toute la commande

réduira essentiellement à:

file

ce qui, bien sûr, est une mauvaise utilisation et renverra une erreur d'utilisation.

(si vous voulez le vérifier par vous-même, vous pouvez essayer:

file `which hostnameX 2>/dev/null`    # just the file-command bad-usage error msg is printed

file `which hostnameX 2>/dev/null` 2>/dev/null  # now nothing is printed on the screen :)
10
Dave K

Le backtick `exécute le contenu de la chaîne incluse, donc quelque chose comme ça

file `which hostname`

trouvera le chemin d'accès à la commande hostname, puis vous expliquera comment il a été créé.

La commande que vous mettez dans votre question s'exécute id -u pour obtenir l'ID utilisateur effectif, puis change la propriété de/somedir pour cet utilisateur.

4
Julian

Ce symbole signifie que tout ce qu'il contient est interprété comme le résultat de cette commande.

par exemple:

$ls /home
one two
$pwd
/usr/three
$cp `pwd` /home
$ls /home
one two three

Ce qui précède entraîne la copie du répertoire three dans mon /home répertoire.

2
Hanan N.

Les backticks ressemblent à la substitution de commandes. Cette syntaxe de backticks est archaïque, et le signe dollar avec deux parenthèses est courant: $().

Qu'est-ce que la substitution de commandes?

La substitution de commande est une opération unique avec une syntaxe dédiée à la fois pour exécuter une commande et pour avoir sa sortie stockée dans une variable pour une utilisation ultérieure.

Un exemple avec date:

thedate=$(date)

Nous pourrions alors imprimer le résultat: 'La date est% s\n' "$ thedate" `.

  1. La syntaxe de substitution de commande est $().
  2. La commande elle-même est date.
  3. En combinant les deux, nous obtenons $(date) dont la sortie est la substitution.
  4. Nous affichons la valeur de sortie détenue par la variable avec printf, par la commande ci-dessus.
1
user9303970