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.


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


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.


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

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.


1

Ada aliasperintah di bash:

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

Penggunaannya adalah: $ shotcommand a


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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.