J'essaie la commande
$ b=5; echo `$b`;
-bash: 5: command not found
mais il n’imprime pas comme il est supposé. Qu'est-ce que j'oublie ici?
Que signifie `(backquote / backtick) dans les commandes? semble dire que `
évalue les commandes et les remplace par la sortie.
bash
shell
command-substitution
coolcric
la source
la source
Réponses:
Le texte entre les guillemets est exécuté et remplacé par le résultat de la commande (moins les caractères de fin de ligne, et notez que les comportements du shell varient lorsque la sortie contient des caractères NUL). Cela s'appelle une substitution de commande car elle est substituée par le résultat de la commande. Donc, si vous voulez imprimer 5, vous ne pouvez pas utiliser de backticks, vous pouvez utiliser des guillemets, comme
echo "$b"
ou tout simplement supprimer une citation et l'utiliserecho $b
.Comme vous pouvez le constater, puisque
$b
contient 5, lorsque backticksbash
tente d’exécuter une commande5
et qu’il n’existe aucune commande de ce type, il échoue avec un message d’erreur.Pour comprendre comment fonctionne les backticks, essayez ceci:
cat /etc/passwd |head -n1
devrait imprimer la première ligne du/etc/passwd
fichier. Mais comme nous utilisons des backticks, cela n’imprime pas cela sur console. Au lieu de cela, il est stocké dansA
variable. Vous pouvez faire écho$A
à cela. Notez que le moyen le plus efficace d’imprimer la première ligne est l’utilisation de la commande,head -n1 /etc/passwd
mais je voulais souligner que l’expression à l’intérieur des backticks ne doit pas nécessairement être simple.Donc si la première ligne de / etc / passwd est
root:x:0:0:root:/root:/bin/bash
, la première commande sera remplacée dynamiquement par bash àA="root:x:0:0:root:/root:/bin/bash"
.Notez que cette syntaxe est celle du shell Bourne. Citer et s'échapper devient rapidement un cauchemar, surtout lorsque vous commencez à les imbriquer. Ksh a introduit l'
$(...)
alternative qui est maintenant normalisée ( POSIX ) et supportée par tous les shells (même le shell Bourne d'Unix v9). Vous devriez donc$(...)
plutôt les utiliser de nos jours, sauf si vous devez être portable sur de très vieux coques Bourne.Notez également que la sortie de
`...`
et$(...)
sont sujettes à la division de mots et à la génération de noms de fichiers, tout comme le développement de variables (en zsh, la division de mots uniquement), il faudrait donc généralement les citer dans des contextes de liste.la source
you can use quotation marks, like echo "$b"
=> le "" fait-il quelque chose de spécial? Cela sembleraitecho $b
fonctionner aussi bien.echo
commande ne se soucie pas du nombre d'arguments qu'elle obtient. Par conséquent, si elleb
contient des espaces, elle obtiendra plusieurs arguments et les imprimera quand même. Ce n'est peut-être pas le cas pour d'autres commandes (en particulier lorsque variable n'est pas défini) et j'ai donc tendance à entourer les variables de guillemets.(POSIX)
serait un lien vers la norme réelle.Le backtick fait exactement ce que vous dites. Vous avez défini une variable sur un entier. Lorsque vous mettez cette variable à l’arrière de backticks, bash essaie de l’exécuter en tant que commande. Comme ce n'est pas une commande, vous obtenez l'erreur que vous avez vue.
Ce que vous voulez faire, c'est simplement:
Pour mieux comprendre les backticks, comparez avec:
la source
Allez pas à pas, votre ligne devrait l'expliquer.
b
à 5$b
(fonctionne efficacement5
)echo
es le résultat de l'évaluation ci-dessus.Alors oui, le résultat que vous avez est attendu. Vous évaluez le contenu d'une variable et non la commande réelle que vous pensiez être. Tout ce que vous mettez dans les backticks est simplay évalué dans un nouveau (sous) shell.
la source