Executando novamente o mesmo comando com um parâmetro diferente

13

Eu sei que posso executar o seguinte comando

ls Some{File,Folder}

E é equivalente a executar isso:

ls SomeFile SomeFolder

(Eu também uso muito para coisas como mv place_{a,b})

No entanto, eu queria saber se havia um atalho diferente onde eu poderia fazer algo assim:

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

E eu só tinha que digitar run-command --a --whole --lot --of --flags parameter {a,b}ou algo parecido.

ashays
fonte
Isso depende run-command, muitos comandos Unix lidam com vários argumentos de arquivo em sequência.
vonbrand

Respostas:

13

Supondo que você esteja usando o GNU bashou algo semelhante:

Talvez um forloop?

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

que também pode ser escrito em uma linha como for x in a b; do run-command --a --whole --lot --of --flags parameter $x ; done

njsg
fonte
1
ou se você tem um monte que você deseja executar, você pode usar a expansão do bash como assimfor x in {a..z}; do ; run-command --a --whole --lot --of --flags parameter $x ; done
h3rrmiller
O que acontece lá pode ser uma lista separada por espaço gerada de várias maneiras. Então, sim, {a..z}, *.pdf, $(find ...)...
njsg
Não sei por que minha mente não pulou para loops. Obrigado! Provavelmente será isso que eu uso. A ideia da função é boa, mas eu gosto mais disso.
ashays
1
O one-liner só funcionou para mim depois de remover a ;seguinte dopalavra - chave.
jimp
@ jimp Obrigado, eu mudei o código para remover isso ;.
Njsg
5

Se você não está criando um script para isso e apenas deseja executá-lo facilmente em uma linha de comando, xargsprovavelmente é o comando que você está procurando.

O xargs pega um monte de conteúdo da entrada padrão e o usa como argumentos para um comando, executando esse comando várias vezes, se necessário.

Tente o seguinte:

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

Neste exemplo, você está simplesmente dando ao xargs as permutações que deseja que ele execute.

O sinalizador "-n 1" para dizer ao xargs para usar apenas 1 dos argumentos por execução.

O sinalizador "-d" diz ao xargs para procurar um "," na entrada como o deliminador entre os argumentos a serem executados. (Observe que, se o argumento tiver um ",", será necessário alterá-lo para outra coisa. Se os argumentos não tiverem espaços, você poderá omitir esse sinalizador completamente.)

Veja man xargspara mais informações.

Hobadee
fonte
4

Você também pode usar uma função, que não o limita a ter seu argumento de alteração no final:

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

runcom a
runcom b
Chris Down
fonte
2

Você pode executar substituições no comando anterior. Isso não funcionará com seu exemplo de {a, b}, porque todas as instâncias de 'a' serão substituídas por um 'b'. Mas imagine que você deseja executar os seguintes comandos:

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

Você pode fazer isso com

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

Bash fará a substituição e executará

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

Use gs (substituição global) para executar várias substituições, não apenas uma.

filante
fonte
1

Há um aliascomando no bash:

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

O uso é: $ shotcommand a

dchirikov
fonte
Há também funções, se o código é um pouco mais complexa :-)
njsg
2
Essa solução só funciona se meu parâmetro de alteração for o último, correto?
ashays
Sim. Você está certo.
dchirikov