web-dev-qa-db-fra.com

Substitution de commande: backticks ou signe dollar / paren inclus?

Quelle est la méthode préférée pour effectuer une substitution de commande dans bash?

Je l'ai toujours fait comme ça:

echo "Hello, `whoami`."

Mais récemment, je l'ai souvent vu écrit comme ceci:

echo "Hello, $(whoami)."

Quelle est la syntaxe préférée et pourquoi? Ou sont-ils à peu près interchangeables?

J'ai tendance à privilégier le premier, simplement parce que mon éditeur de texte semble savoir de quoi il s'agit et met en évidence la syntaxe de manière appropriée.

J'ai lu ici que les caractères échappés agissent un peu différemment dans chaque cas, mais je ne sais pas quel comportement est préférable, ou si cela dépend de la situation.

Question secondaire: est-ce une mauvaise pratique d’utiliser les deux formes dans un script, par exemple lors de l’imbrication de substitutions de commandes?

154
Dagg Nabbit

Il y a plusieurs questions/problèmes ici, donc je vais répéter chaque section du texte de l'affiche, cité en bloc et suivie de ma réponse.

Quelle est la syntaxe préférée et pourquoi? Ou sont-ils à peu près interchangeables?

Je dirais que la forme $(some_command) est préférable à la forme `some_command` forme. La seconde forme, utilisant une paire de guillemets arrières (le caractère "` ", également appelé backtick et accent grave), constitue la manière historique de le faire. Le premier formulaire, utilisant le signe dollar et les parenthèses, est un formulaire POSIX plus récent, ce qui signifie que c'est probablement une méthode plus standard. À mon tour, je pense que cela signifie qu'il est plus probable que cela fonctionne correctement avec différents shells et avec différentes implémentations * nix.

Une autre raison donnée pour préférer le premier formulaire (POSIX) est qu’il est plus facile à lire, en particulier lorsque les substitutions de commandes sont imbriquées. De plus, avec la forme backtick, les caractères backtick doivent être protégés par une barre oblique inverse dans les substitutions de commandes imbriquées (internes).

Avec le formulaire POSIX, vous n'avez pas besoin de faire cela.

Quant à savoir s'ils sont interchangeables, eh bien, je dirais qu'en général, ils sont interchangeables, à l'exception des exceptions que vous avez mentionnées pour les caractères échappés. Cependant, je ne sais pas et ne peux pas dire si tous les shells modernes et tous les * nix modernes supportent les deux formes. Je doute qu'ils le fassent, en particulier les vieux coquillages/vieux * nixes. Si j'étais vous, je ne dépendrais pas de l'interchangeabilité sans exécuter au préalable quelques tests simples et rapides de chaque formulaire sur toutes les implémentations Shell/* nix sur lesquelles vous prévoyez d'exécuter vos scripts terminés.

J'ai tendance à privilégier le premier, simplement parce que mon éditeur de texte semble savoir de quoi il s'agit et met en évidence la syntaxe de manière appropriée.

Il est regrettable que votre éditeur ne semble pas supporter le formulaire POSIX; Peut-être devriez-vous vérifier s'il existe une mise à jour de votre éditeur qui prend en charge la méthode POSIX. Long shot peut-être, mais qui sait? Ou peut-être devriez-vous même envisager d'essayer un autre éditeur.

GGG, quel éditeur de texte utilisez-vous ???

Je lis ici que les caractères échappés agissent un peu différemment dans chaque cas, mais je ne sais pas quel comportement est préférable ou s'il dépend simplement de la situation.

Je dirais que cela dépend de ce que vous essayez d'accomplir. en d'autres termes, que vous utilisiez ou non des caractères d'échappement avec substitution de commande.

Question annexe: est-il déconseillé d’utiliser les deux formulaires dans un seul script, par exemple lors de l’imbrication de substitutions de commandes?

Cela rendrait le script un peu plus facile à lire (typographiquement), mais plus difficile à comprendre! Quelqu'un lisant votre script (ou VOUS, le lisant six mois plus tard!) Se demanderait probablement pourquoi vous ne vous en êtes pas tenu à une forme ou à une autre - à moins que vous ne mettiez une note sur la raison pour laquelle vous avez fait cela dans les commentaires. De plus, le fait de mélanger les deux formes dans un script rendrait celui-ci moins portable. Pour que le script fonctionne correctement, le shell qui l'exécute doit prendre en charge les deux formes, pas seulement une forme ou l'autre.

Pour rendre un script Shell compréhensible, je préférerais personnellement coller à un formulaire ou à un autre tout au long d’un script, sauf s’il existe une bonne raison technique de ne pas le faire. De plus, je préférerais le formulaire POSIX à l'ancien. Encore une fois, à moins qu'il y ait une bonne raison technique de faire autrement.

Pour en savoir plus sur le remplacement des commandes, et sur les deux formes différentes, je vous suggère de vous reporter à la section sur le remplacement des commandes dans le livre O'Reilly "Classic Shell Scripting", deuxième édition, de Robbins et Beebe. Dans cette section, les auteurs indiquent que le formulaire POSIX pour la substitution de commande "est recommandé pour tous les nouveaux développements". Je n'ai aucun intérêt financier dans ce livre; C’est juste une des technologies que j’ai (et que j’ai aimées) sur les scripts Shell, bien que ce soit plus pour les scripts Shell intermédiaires ou avancés, et pas vraiment pour commencer les scripts Shell.

-B.

152
Bruce Brown

Vous pouvez lire les différences entre manuel bash . Dans la plupart des cas, ils sont interchangeables.


Une chose à mentionner est que vous devriez échapper à backquote pour imbriquer des commandes:

$ echo $(echo hello $(echo Word))
hello Word    

$ echo `echo hello \`echo Word\``
hello Word

41
kev

Les backticks étant compatibles avec les anciens shells, les scripts qui doivent être portables (tels que GNU extraits de autoconf)) doivent les préférer.

La forme $() est un peu plus facile pour les yeux, en particulier. après quelques niveaux d'évasion.

8
phs