Réexécuter la même commande avec un paramètre différent

13

Je sais que je peux exécuter la commande suivante

ls Some{File,Folder}

Et cela revient à exécuter ceci:

ls SomeFile SomeFolder

(Je l'utilise aussi beaucoup pour des choses comme mv place_{a,b})

Cependant, je me demandais s'il y avait un raccourci différent où je pouvais faire quelque chose comme ça:

run-command --a --whole --lot --of --flags parameter a; \
     run-command --a --whole --lot --of --flags parameter b

Et je n'avais qu'à taper run-command --a --whole --lot --of --flags parameter {a,b}ou quelque chose de similaire.

ashays
la source
Cela dépend run-command, de nombreuses commandes Unix gèrent plusieurs arguments de fichier en séquence.
vonbrand

Réponses:

13

En supposant que vous utilisez GNU bashou quelque chose de similaire:

Peut-être une forboucle?

for x in a b
do
    run-command --a --whole --lot --of --flags parameter $x
done

qui peut également être écrit sur une ligne comme for x in a b; do run-command --a --whole --lot --of --flags parameter $x ; done

njsg
la source
1
ou si vous avez beaucoup de choses à exécuter, vous pouvez utiliser l'expansion bash comme çafor x in {a..z}; do ; run-command --a --whole --lot --of --flags parameter $x ; done
h3rrmiller
Ce qui s'y passe peut être une liste séparée par des espaces générée de plusieurs manières. Alors oui, {a..z}, *.pdf, $(find ...)...
njsg
Je ne sais pas pourquoi mon esprit n'a pas sauté sur les boucles. Merci! Ce sera probablement ce que j'utilise. L'idée de la fonction est bonne, mais j'aime mieux cela.
ashays
1
Le one-liner n'a fonctionné pour moi qu'après avoir supprimé ;le domot - clé suivant.
jimp
@jimp Merci, j'ai changé le code pour le supprimer ;.
njsg
5

Si vous n'écrivez pas ceci et que vous voulez simplement l'exécuter facilement sur une ligne de commande, la xargscommande est probablement ce que vous recherchez.

xargs prendra un tas de contenu de l'entrée standard et l'utilisera comme arguments pour une commande, exécutant cette commande plusieurs fois si nécessaire.

Essayez ce qui suit:

echo parameter a,parameter b | xargs -n 1 -d , run-command --a --whole --lot --of --flags

Dans cet exemple, vous donnez simplement à xargs les permutations que vous souhaitez qu'il exécute.

L'indicateur "-n 1" pour indiquer à xargs d'utiliser uniquement 1 des arguments par exécution.

L'indicateur "-d," indique à xargs de rechercher un "," sur l'entrée comme séparateur entre les arguments à exécuter. (Notez que si l'argument contient un "," vous devrez le changer en quelque chose d'autre. Si vos arguments n'ont pas d'espace, vous pouvez omettre complètement cet indicateur.)

Voir man xargspour plus d'informations.

Hobadee
la source
4

Vous pouvez également utiliser une fonction, ce qui ne vous limite pas à avoir votre argument changeant à la fin:

runcom() { run-command --a --whole --lot --of --flags parameter "$1" ; }

runcom a
runcom b
Chris Down
la source
2

Vous pouvez effectuer des substitutions dans la commande précédente. Cela ne fonctionnera pas avec votre exemple {a, b}, car toutes les instances de 'a' seront remplacées par un 'b'. Mais imaginez que vous souhaitez exécuter les commandes suivantes:

run-command --a --whole --lot --of --parameter --format xml
run-command --a --whole --lot --of --parameter --format son

Vous pouvez le faire avec

run-command --a --whole --lot --of --parameter --format xml
!!:s/xml/json/

Bash fera la substitution et courra

run-command --a --whole --lot --of --parameter --format json

Utilisez gs (substitution globale) pour effectuer plusieurs substitutions, pas une seule.

philant
la source
1

Il y a une aliascommande dans bash:

$ alias shotcommand='run-command --a --whole --lot --of --flags parameter'

L'utilisation est: $ shotcommand a

dchirikov
la source
Il y a aussi des fonctions, si le code est un peu plus complexe :-)
njsg
2
Cette solution ne fonctionne que si mon paramètre changeant est le dernier, n'est-ce pas?
ashays
Oui. Tu as raison.
dchirikov