Expansion Brace: exécuter plusieurs commandes au lieu de développer sur une seule ligne?

11

Lorsque vous utilisez l'expansion d'accolade dans bash, quelque chose comme

echo {a,b,c}

devient

echo a b c

Existe-t-il un moyen de l'étendre à 3 commandes distinctes, une pour chaque extension, à la place?

Pour que:

echo {a,b,c}

deviendrait

echo a
echo b
echo c
houbysoft
la source

Réponses:

12

S'agit-il simplement d'une question «parce que je veux savoir» ou existe-t-il un vrai cas d'utilisation? Nous pourrions faire de la gymnastique pour le faire:

$ eval echo\ {a,b,c}\;
a
b
c

Mais je traquerais toute personne qui introduirait ce genre de commandes obscures dans nos scripts système.

Pourquoi ne pas opter pour la clarté:

$ for X in {a,b,c}; do echo $X; done

Vous pourriez même vous lancer dans le porc entier et ajouter quelques nouvelles lignes et les indenter un peu afin que vous puissiez toujours comprendre ce que vous essayez de faire.

impythonique
la source
4
@peth - Je suppose que c'est un exemple simplifié. Si c'est aussi simple qu'une liste, alors vous avez raison. Si c'est quelque chose de plus, file-{r,b,g}{m,n,o}{x,y.z}.fooil vaut mieux utiliser le formulaire court que d'énumérer les 27 valeurs.
unpythonic
@peth - Je pensais que c'était une bonne question de suivi.
Unpythonic
je veux savoir cela depuis longtemps, merci! :)
Sirex
1
Eh bien, le cas d'utilisation était des programmes qui n'acceptent pas plus d'un fichier (par exemple), donc où l'expansion ne fonctionnerait pas. Par conséquent, ce serait bien de pouvoir facilement exécuter le programme plusieurs fois. Les forœuvres pour cela, mais il est encore plus besoin de taper: P
houbysoft
Je l'ai utilisé pour nettoyer plusieurs branches git:eval git branch -d \{ branch-a, branch-b }\;
Kit
3

Sur la base de la réponse choisie par Mark Mann , j'ai pu dériver davantage cet exemple, qui fonctionne très bien:

$ eval echo\ category_{17,32,33}.properties\{,.bak\}\;
category_17.properties category_17.properties.bak
category_32.properties category_32.properties.bak
category_33.properties category_33.properties.bak

Ce que cela montre, c'est que lorsque vous utilisez plusieurs occurrences d'expansion d'accolade au sein d'une ligne, l'exemple original de Mark aurait imprimé chaque variation individuellement. Au lieu de cela, je voulais utiliser sa réponse pour déplacer / renommer plusieurs fichiers. Pour m'assurer que la sortie correspondait au format qui mvattend normalement ( mv oldfilename newfilename), j'ai échappé à la deuxième occurrence de l'accolade, afin qu'elle ne soit évaluée qu'après l' evalexécution de la commande initiale .

Comme la sortie ci-dessus est apparue comme prévu, j'ai ensuite pu exécuter la commande suivante:

$ eval mv\ category_{17,32,33}.properties\{,.bak\}\;
$ ls
category_17.properties.bak  category_32.properties.bak  category_33.properties.bak

Un grand merci à Mark pour sa réponse originale. Veuillez voter pour sa réponse si vous aimez ce que sa réponse m'a permis de faire :-)

Jon L.
la source
0
printf '%s\n'  echo{\ a,\ b,\ c}
tae
la source
eval echo {\ a \;, \ b \;, \ c \;}
Brian Vandenberg