Y a-t-il une raison d'utiliser ou d'enseigner la substitution du nouveau développement?

16

Je crois comprendre que la $(...)syntaxe de substitution de commandes plus moderne est préférée à la `syntaxe basée sur l'ancienne , en raison d'une syntaxe d'imbrication et d'échappement plus facile et moins sujette aux erreurs.

De plus, il semble que la plupart /bin/shdes shells de style moderne prennent en charge $(…):

  • frapper
  • ash (et donc BusyBox, donc la plupart des Linux embarqués)
  • tiret
  • FreeBSD / bin / sh

Et $(…)est spécifié par IEEE 1003.1.

J'ai donc 2 questions très liées:

  • Y a-t-il une raison d'utiliser `dans le nouveau développement de scripts shell à moins que vous ne connaissiez un ancien système spécifique sur lequel le script devra fonctionner?
  • Y a-t-il une raison de ne pas enseigner aux étudiants en programmation UNIX juste à écrire $(...)et à discuter `uniquement en tant que variante obsolète qu'ils rencontreront probablement s'ils lisent les scripts shell d'autres développeurs (et peuvent avoir besoin s'ils travaillent avec un système très ancien ou non standard) pour certaines raisons)?
Michael Ekstrand
la source
7
Non, il est inutile d'utiliser ou d'enseigner `...`. Il est là pour la portabilité vers l'arrière avec le shell Bourne uniquement (comme le shell Bourne avait ^(la même chose que |) pour la portabilité vers l'arrière avec le shell Thomson). Notez cependant que (t)cshce n'est pas le cas $(...)(mais cela ne sert à rien de les utiliser ou de les enseigner non plus).
Stéphane Chazelas
2
C'est une chose Groucho Marx `; {)
goldilocks
2
Attendez, les backticks sont déconseillés ?? Quelqu'un at-il une référence canonique expliquant pourquoi? (Les caractères de syntaxe étranges sont très difficiles à rechercher.)
MathematicalOrchid
1
Plus facile à taper. `` - 2 touches pressées; $()- Maj + 4,9, Maj + 0 - 5 pressions de touche;
Vi.
3
@MathematicalOrchid stackoverflow.com/questions/9405478/… semble assez bon. Les astuces sont très difficiles à imbriquer correctement, en particulier lorsque des devis supplémentaires sont impliqués.
Michael Ekstrand

Réponses:

19

Étant donné que les ticks arrière sont souvent utilisés, il est logique d'enseigner cette construction syntaxique.

Bien sûr, la $()substitution de commande de style doit être soulignée comme style par défaut (et construction conforme standard).

Pourquoi les back-ticks sont-ils toujours aussi populaires? Parce qu'ils économisent un caractère en tapant, et ils sont sans doute moins lourds à l'œil.

maxschlepzig
la source
18
Je ne caractériserais pas "moins lourd sur l'oeil" comme une fonctionnalité, mais un bug ...
jasonwryan
1
Normalement, j'utilise des backsticks dans les cas simples et $ () dans les cas complexes. Mais beaucoup de scripts utilisent les backsticks jusqu'à présent, et les diplômés devaient pouvoir se débrouiller avec eux.
peterh
@jasonwryan Dans ce cas, le bogue n'est pas dû à la brièveté, mais à des problèmes arbitraires. C'est-à-dire que l'utilisation des contre - coups est plus agréable à l'œil, mais ce n'est pas pour cela qu'elle est dépréciée. À moins que vous n'essayiez de dire que le sucre est par définition mauvais et que nous devrions tous préférer l'asm pour quoi que ce soit ... En fait, j'aime le look du $()meilleur mais les contre-coups sont plus faciles et plus KISS; pourrait être une conséquence OCDish pavlovienne de la programmation générale.
goldilocks
@goldilocks une fois que vous vieillissez, la lisibilité est tellement plus difficile de toute façon: les backticks sont pratiquement invisibles dans le code à mon âge ...
jasonwryan
3
Sur un clavier français , par exemple, `est Altrg + è, (maladroit type), alors que $, (, )ne nécessitent pas de modification.
Stéphane Chazelas
5

Je ne les utiliserais pas pour la programmation, et l'enseignement de l'utilisation de la substitution de backtick dans les scripts shell est obsolète (cela semble être le consensus). Je ne pense pas qu'ils soient intrinsèquement mauvais, cependant, et (au moins à en juger par votre didacticiel moyen sur la ligne de commande Linux), ils sont encore fréquemment utilisés dans de simples extraits / lignes simples où ils ne seront probablement pas imbriqués et les choses que vous ne vais faire qu'une seule fois.

Voir Substitution de commandes: backticks ou signe dollar / paren inclus? .

jaymmer - Réintégrer Monica
la source
1

J'évite d'utiliser la $()construction car elle n'est pas portable - dans le monde réel. Vous avez répertorié quatre obus - il y a beaucoup plus de variations que cela autour (un ordre de grandeur?). Essayez d'exécuter votre script dans Solaris / bin / sh et voyez comment vous allez.

D'un autre côté, quand arrêtez-vous de prendre en charge les anciens systèmes? ne pouvez-vous jamais progresser vers de nouvelles façons de faire? Je pense que vous devriez faire confiance à votre propre jugement, et si vous pouvez voir un avantage certain de la nouvelle façon sur l'ancienne, alors allez-y ... ce n'est pas l'un d'eux (personnellement, je trouve les bacticks beaucoup plus clairs - ils ne peuvent pas être confondu avec la substitution de variable shell, ce qui est différent)

Murray Jensen
la source
1
POSIX ne précise pas qui /bin/shdoit être conforme. Le Solaris /bin/shest en effet très non conforme - bien que Solaris 9/10 / ... soit officiellement compatible POSIX. C'est $()juste une construction qu'il ne comprend pas. Mais il y en a beaucoup d'autres qu'il ne comprend pas ou qui sont interprétés différemment. La manière portable d'obtenir une conformité shpour la rechercher dans le chemin renvoyé par getconf PATH.
maxschlepzig