Menjalankan kembali perintah yang sama dengan parameter yang berbeda

13

Saya tahu bahwa saya dapat menjalankan perintah berikut

ls Some{File,Folder}

Dan itu setara dengan menjalankan ini:

ls SomeFile SomeFolder

(Saya juga banyak menggunakannya untuk hal-hal seperti mv place_{a,b})

Namun, saya bertanya-tanya apakah ada jalan pintas berbeda di mana saya bisa melakukan sesuatu seperti ini:

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

Dan saya hanya perlu mengetik run-command --a --whole --lot --of --flags parameter {a,b}atau yang serupa.

ashays
sumber
Itu tergantung pada run-command, banyak perintah Unix menangani beberapa argumen file secara berurutan.
vonbrand

Jawaban:

13

Dengan asumsi bahwa Anda menggunakan GNU bashatau yang serupa:

Mungkin satu forputaran?

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

yang juga dapat ditulis dalam satu baris sebagai for x in a b; do run-command --a --whole --lot --of --flags parameter $x ; done

njsg
sumber
1
atau jika Anda memiliki banyak hal yang ingin Anda jalankan, Anda dapat menggunakan ekspansi bash seperti itufor x in {a..z}; do ; run-command --a --whole --lot --of --flags parameter $x ; done
h3rrmiller
Apa yang terjadi di sana dapat berupa daftar yang dipisahkan ruang yang dihasilkan dalam banyak cara. Jadi ya, {a..z}, *.pdf, $(find ...)...
njsg
Saya tidak tahu mengapa pikiran saya tidak melompat. Terima kasih! Ini mungkin yang akan saya gunakan. Gagasan fungsinya bagus, tapi saya suka ini lebih baik.
abu
1
One-liner hanya berfungsi untuk saya setelah menghapus kata kunci ;berikut do.
gendut
jimp Terima kasih, saya telah mengubah kode untuk menghapusnya ;.
njsg
5

Jika Anda tidak membuat skrip ini dan hanya ingin menjalankannya dengan mudah di baris perintah, xargsperintah itu mungkin yang Anda cari.

xargs akan mengambil banyak konten dari input standar, dan menggunakannya sebagai argumen untuk suatu perintah, menjalankan perintah itu beberapa kali jika diperlukan.

Coba yang berikut ini:

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

Dalam contoh ini, Anda hanya memberikan xargs permutasi yang Anda inginkan untuk dijalankan.

Bendera "-n 1" untuk memberi tahu xargs untuk menggunakan hanya 1 argumen per run.

Bendera "-d," memberi tahu xargs untuk mencari "," pada input sebagai pembatas di antara argumen yang akan dijalankan. (Perhatikan bahwa jika argumen memiliki "," di dalamnya, Anda perlu mengubahnya ke sesuatu yang lain. Jika argumen Anda tidak memiliki spasi di dalamnya, Anda dapat menghilangkan tanda ini sama sekali.)

Lihat man xargsuntuk info lebih lanjut.

Hobadee
sumber
4

Anda juga dapat menggunakan fungsi, yang tidak membatasi Anda untuk memiliki argumen yang berubah di akhir:

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

runcom a
runcom b
Chris Down
sumber
2

Anda dapat melakukan pergantian pada perintah sebelumnya. Ini tidak akan berfungsi dengan contoh {a, b} Anda, karena semua instance 'a' akan diganti dengan 'b'. Tapi bayangkan Anda ingin menjalankan perintah berikut:

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

Anda bisa melakukannya dengan

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

Bash akan melakukan pergantian dan lari

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

Gunakan gs (substitusi global) untuk melakukan beberapa substitusi, tidak hanya satu.

filant
sumber
1

Ada aliasperintah di bash:

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

Penggunaannya adalah: $ shotcommand a

dchirikov
sumber
Ada juga fungsi, jika kodenya sedikit lebih rumit :-)
njsg
2
Solusi ini hanya berfungsi jika parameter perubahan saya adalah yang terakhir, benar?
abu
Iya. Kamu benar.
dchirikov