2008-09-30 12 views

Répondre

13

'Raisins hystériques', aka raisons historiques.

L'explication de JesperE (ou la page man Bash) est exacte pour ce qu'il fait:

Si 1 $ existe et n'est pas une chaîne vide, puis substituer la liste cité des arguments. Il y a une vingtaine d'années, certaines variantes mineures cassées de Bourne Shell substituaient une chaîne vide "" pour "$ @" s'il n'y avait pas d'arguments, au lieu du comportement correct et actuel de ne rien substituer. L'utilisation de tels systèmes est sujette à débat.

[Hmm: que l'expansion ne serait pas correctement pour:

command '' arg2 arg3 ... 

Dans ce contexte, la notation correcte est:

${1+"[email protected]"} 

Cela fonctionne correctement si 1 $ est un argument vide ou non. Alors, quelqu'un se souvenait de la notation de manière incorrecte, l'introduction accidentelle d'un bug]

+5

Ah ah. Oui, au moins selon http://google.com/codesearch la notation que vous avez mentionnée est beaucoup plus commune. Je vois 191 000 résultats pour $ {1 + "$ @"} (c'est-à-dire pas de deux-points) contre 173 résultats pour $ {1: + "$ @"}.Bien sûr, la citation de "homme bash" a deux points. Alors peut-être que l'utilisation du côlon n'est pas un bug. . . –

+2

Le deux-points est un test différent - il cherche une chaîne non vide. Il est le plus souvent utilisé en relation avec un var var qui doit avoir une valeur: $ {ENVVAR: + "- value = $ ENVVAR"} ou autre. Cela crée un argument -value = quel que soit si ENVVAR est défini sur une chaîne non vide. –

2

Sur la page man bash:

${parameter:+word} 
      Use Alternate Value. If parameter is null or unset, nothing is 
      substituted, otherwise the expansion of word is substituted. 

Ainsi, "[email protected]" est substitué à moins $1 est hors service. Je ne vois pas pourquoi ils n'auraient pas pu utiliser "[email protected]".

+0

BTW: Le bash homme-page est vraiment votre ami en ce qui concerne des questions comme celle-ci. C'est probablement la page de manuel que j'utilise le plus souvent. – JesperE

+0

Vous avez raison à propos de 'man bash'. Désolé, j'avais trouvé cette citation, mais je ne l'ai pas incluse dans ma question. Je suis d'accord qu'ils auraient probablement pu simplement utiliser "$ @" mais il doit y avoir une raison pour $ {1: + "$ @"}. . . peut-être que nous le saurons. :) –

+0

Je n'exclurais pas non plus la programmation vaudou. ;-) – JesperE

2

Pour citer la partie pertinente de man bash pour les informations Jonathan Leffler mentionné dans son commentaire.

Lorsque ne pas effectuer l'expansion du sous-chaîne , tests bash pour un paramètre non défini ou nul; en omettant les deux-points entraîne un test uniquement pour un paramètre non défini.

(Souligné par l'auteur)