Comment savoir quelles commands utiliseront l'expansion d'accolade et lesquelles ne le seront pas?

Par exemple, cela fonctionne:

$ curl -s -X GET "http://api-int.abc.com/api/{,,,}ukulele/v1/health"

Cela fonctionne 4 commands curl, ce qui est ce que je veux.

Pendant ce time, ping n'utilisera pas d'extension d'accolade:

 $ ping {google,yahoo,microsoft}.com usage: ping [-AaDdfnoQqRrv] [-b boundif] [-c count] [-G sweepmaxsize] 

Mais le toucher va:

$ touch .temp/{a,b,c}.txt

Crée trois files.

Comment est-ce que je pourrais savoir de la page de man pour ces commands quelles peuvent employer l'expansion d'accolade?

La première chose à comprendre est que certaines commands autorisent plusieurs arguments et d'autres pas. Alors que le touch permet plusieurs arguments, ping ne le fait pas. Dans le cas de ping , les accolades se multiplient en appelant ping avec plusieurs arguments, ce qui n'est pas le cas de ping . Une boucle for est une meilleure solution dans ce cas. En outre, les accolades en curl sont un cas particulier (voir ci-dessous).

La réponse à "quelles commands peuvent utiliser l'extension d'accolade" est tout et rien. L'expansion de l'accolade est effectuée par le shell, avant de transmettre la sortie développée à la command. En d'autres termes, la command lancée est complètement non pertinente. L'expansion de foo{bar,baz} à foobar foobaz est faite par le shell avant de lancer la command et de passer la string développée en tant que parameters.

Cependant, l'expansion d'accolade ne se produit pas à l'intérieur des guillemets. En d'autres termes, à la fois "{,,,}" et "{a,b,c}" restnt comme des strings et ne sont pas développés:

 $ echo "{,,,}" {,,,} $ echo "{a,b,c}" {a,b,c} 

Pour que l'extension fonctionne, vous devez supprimer les guillemets:

 $ echo {,,,} ## this expands to a blank ssortingng, so this is what is printed $ echo {a,b,c} abc 

Ceci est documenté dans la section pertinente de l' man bash (emphase mienne):

L'extension de l'accolade est effectuée avant toute autre expansion , et tout caractère spécial à d'autres extensions est conservé dans le résultat. C'est ssortingctement textuel. Bash n'applique aucune interprétation syntaxique au context de l'expansion ou du text entre les accolades.

Une extension d'accolade correctement formée doit contenir des accolades d'ouverture et de fermeture sans guillemets , et au less une virgule non cotée ou une expression de séquence valide.

Maintenant, la raison pour laquelle vous êtes confus est que curl a son propre parsingur et gère également l'expansion de l'accolade. Ceci est fait indépendamment de la coquille et est expliqué dans l' man curl :

Vous pouvez spécifier plusieurs URL ou parties d'URL en écrivant des sets de pièces entre accolades, comme dans:

  http://site.{one,two,three}.com 

Ainsi, n'importe quelle command peut fonctionner avec l'expansion d'accolade car ce n'est pas réellement la command qui fonctionne avec elle, mais le shell qui étend l'expression dans les accolades avant d'appeler la command. Curl est source de confusion car il a sa propre caractéristique similaire.