Riesecuzione dello stesso comando con un parametro diverso


13

So che posso eseguire il seguente comando

ls Some{File,Folder}

Ed è equivalente a eseguire questo:

ls SomeFile SomeFolder

(Lo uso anche molto per cose come mv place_{a,b})

Tuttavia, mi chiedevo se esistesse una scorciatoia diversa in cui avrei potuto fare qualcosa del genere:

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

E ho dovuto solo scrivere run-command --a --whole --lot --of --flags parameter {a,b}o qualcosa di simile.


Dipende da run-command, molti comandi Unix gestiscono diversi argomenti di file in sequenza.
vonbrand,

Risposte:


13

Supponendo che tu stia usando GNU basho qualcosa di simile:

Forse un forciclo?

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

che può anche essere scritto in una riga come for x in a b; do run-command --a --whole --lot --of --flags parameter $x ; done


1
o se hai molte cose che vuoi eseguire puoi usare l'espansione bash in questo modofor x in {a..z}; do ; run-command --a --whole --lot --of --flags parameter $x ; done
h3rrmiller

Ciò che accade lì può essere un elenco separato da spazi generato in molti modi. Quindi sì, {a..z}, *.pdf, $(find ...)...
njsg

Non so perché la mia mente non sia passata ai loop. Grazie! Questo sarà probabilmente quello che uso. L'idea della funzione è buona, ma mi piace di più.
chiede

1
Il one-liner ha funzionato per me solo dopo aver rimosso la ;seguente doparola chiave.
jimp

@jimp Grazie, ho cambiato il codice per rimuoverlo ;.
njsg,

5

Se non stai scrivendo questo script e vuoi solo eseguirlo facilmente su una riga di comando, xargsprobabilmente il comando è quello che stai cercando.

xargs prenderà un sacco di contenuti dallo standard input e lo userà come argomento per un comando, eseguendolo più volte se necessario.

Prova quanto segue:

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

In questo esempio, stai semplicemente dando a xargs le permutazioni che vuoi che eseguano.

Il flag "-n 1" per indicare a xargs di usare solo 1 degli argomenti per esecuzione.

Il flag "-d" dice a xargs di cercare un "," sull'input come delimitatore tra gli argomenti da eseguire. (Nota che se l'argomento contiene un "," dovrai cambiarlo in qualcos'altro. Se i tuoi argomenti non hanno spazi, puoi omettere del tutto questo flag.)

Vedi man xargsper maggiori informazioni.


4

Puoi anche usare una funzione, che non ti limita ad avere il tuo argomento cambiante alla fine:

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

runcom a
runcom b

2

È possibile eseguire sostituzioni nel comando precedente. Questo non funzionerà con il tuo esempio {a, b}, poiché tutte le istanze di 'a' verranno sostituite con una 'b'. Ma immagina di voler eseguire i seguenti comandi:

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

Puoi farlo con

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

Bash farà la sostituzione ed eseguirà

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

Usa gs (sostituzione globale) per eseguire diverse sostituzioni, non solo una.


1

C'è un aliascomando in bash:

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

L'utilizzo è: $ shotcommand a


Ci sono anche funzioni, se il codice è un po 'più complesso :-)
njsg

2
Questa soluzione funziona solo se il mio parametro di modifica sembra essere l'ultimo, giusto?
ashays

Sì. Hai ragione.
Dchirikov,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.