Pour enregistrer la sortie d'une commande en tant que variable dans sh/ksh/bash, vous pouvez faire l'une ou l'autre des choses suivantes
var=$(command)
ou
var=`command`
Quelle est la différence éventuelle entre les deux méthodes ?
Pour enregistrer la sortie d'une commande en tant que variable dans sh/ksh/bash, vous pouvez faire l'une ou l'autre des choses suivantes
var=$(command)
ou
var=`command`
Quelle est la différence éventuelle entre les deux méthodes ?
Les backticks/gravemarks ont été abandonnés au profit de $()
pour la substitution de commande car $()
peut facilement s'imbriquer à l'intérieur de lui-même, comme dans $(echo foo$(echo bar))
. Il existe d'autres différences, comme la façon dont les barres obliques inverses sont traitées dans la version backtick/gravemark, etc.
Véase BashFAQ/082 pour plusieurs raisons de toujours préférer la syntaxe $(...).
Voir aussi le POSIX pour obtenir des informations détaillées sur les différentes différences.
Bon lien, mais ce texte n'est pas déprécier les guillemets en faveur de $(...)
- il les mentionne simplement comme des alternatives.
@NormanGray POSIX ne peut pas dire le mot obsolète mais il est dit "the backquoted variety of command substitution is not recommended"
ce qui n'est qu'une longue façon de dire "déprécié" IMHO
POSIX n'a pas supprimé les antisèches, mais a plutôt ajouté $(...)
comme méthode alternative. Il n'y a pas de bogue d'implémentation connu avec les backticks, mais il y a de nombreux bogues d'implémentation connus avec les $(...)
. Pour des raisons de portabilité, il est donc recommandé d'utiliser des antisèches pour les appels non imbriqués. $(...)
a besoin d'un analyseur récursif, mais celui-ci n'a pas été utilisé avec ksh86 qui a introduit cette fonctionnalité. Vérifier in-ulm.de/~mascheck/various/cmd-subst pour une liste des implémentations correctes. Un shell conforme doit prendre en charge tous les cas à l'exception du cas D.2.
echo $(echo \$abc)
n'est pas la même chose que echo `echo \$abc`
- Des différences existent également pour $(echo \`)
y $(echo \\)
Juillet 2014 : Le commit f25f5e6 (par Elia Pinto ( devzero2000
) avril 2014, Git 2.0) ajoute au problème d'imbrication :
La forme entre guillemets est la méthode traditionnelle de substitution des commandes et est prise en charge par POSIX.
Cependant, toutes les utilisations, sauf les plus simples, se compliquent rapidement.
En particulier, les substitutions de commandes intégrées et/ou l'utilisation de guillemets doubles nécessitent l'utilisation de la commande l'utilisation de guillemets doubles nécessitent un échappement soigneux avec le caractère backslash .
C'est pourquoi la git/Documentation/CodingGuidelines mentions :
Nous préférons
$( ... )
pour la substitution de commandes ; contrairement à ``, il s'emboîte correctement .
Cela aurait dû être l'orthographe de Bourne dès le premier jour, mais ce n'est malheureusement pas le cas.
C'est pourquoi
`echo `foo``
ne fonctionnera pas en général en raison de l'ambiguïté inhérente au fait que chaque``
peut être ouvert ou fermé.
Elle peut fonctionner dans des cas particuliers dus à la chance ou à des caractéristiques spéciales.
Mise à jour janvier 2016 : Git 2.8 (mars 2016) se débarrasse entièrement des backticks.
Véase commit ec1b763 , commit 9c10377 , commit c7b793a , commit 80a6b3f , commit 9375dcf , commit e74ef60 , commit 27fe43e , commit 2525c51 , commit becd67f , commit a5c98ac , commit 8c311f9 , commit 57da049 , commit 1d9e86f , commit 78ba28d , commit efa639f , commit 1be2fa0 , commit 38e9476 , commit 8823d2f , commit 32858a0 , commit cd914d8 (12 janv. 2016) par Elia Pinto ( devzero2000
) .
(fusionné par Junio C Hamano -- gitster
-- en commit e572fef , 22 janv. 2016)
A partir de Git 2.8, c'est tout $(...)
, pas plus `...`
.
Lorsque l'ancienne forme back-tick est utilisée, la barre oblique inverse conserve sa signification littérale, sauf lorsqu'elle est suivie de $, ` ou \. Le premier bâton qui n'est pas précédé d'une barre oblique inverse met fin à la substitution de commande.
Lors de l'utilisation de la version la plus récente du $(command)
tous les caractères entre les parenthèses constituent la commande ; aucun n'est traité de manière particulière.
Les deux formes peuvent être imbriquées, mais la variété "back-tick" nécessite la forme suivante.
`echo \`foo\``
Par opposition à :
$(echo $(foo))
Il y a peu de différences, sauf en ce qui concerne les caractères non codés que vous pouvez utiliser à l'intérieur de la commande. Vous pouvez même mettre `...` commandes à l'intérieur $(...) (et vice versa) pour une substitution de commande plus compliquée à deux niveaux de profondeur.
L'interprétation du caractère/opérateur backslash est légèrement différente. Entre autres, lors de l'imbrication de `...` les commandes de substitution, vous devez échapper à la partie intérieure de la ` caractères avec \, alors qu'avec $() il comprend automatiquement l'imbrication.
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.
32 votes
Voir BashFAQ/082 .
0 votes
Vous trouverez le problème imbriqué détaillé dans les lignes directrices de codage de Git : voir ma réponse ci-dessous .
0 votes
En rapport : unix.stackexchange.com/questions/126927