Ekspansi Brace: menjalankan beberapa perintah alih-alih memperluas pada satu baris?


11

Ketika Anda menggunakan ekspansi brace di bash, sesuatu seperti

echo {a,b,c}

menjadi

echo a b c

Apakah ada cara untuk mengembangkannya menjadi 3 perintah terpisah, satu untuk setiap ekspansi, sebagai gantinya?

Yang seperti itu:

echo {a,b,c}

akan menjadi

echo a
echo b
echo c

Jawaban:


12

Apakah ini hanya pertanyaan "karena saya ingin tahu", atau apakah ada kasus penggunaan nyata untuk itu? Kita bisa menjalani beberapa senam untuk menyelesaikannya:

$ eval echo\ {a,b,c}\;
a
b
c

Tetapi saya akan memburu siapa pun yang memasukkan perintah-perintah yang membingungkan ini ke dalam skrip sistem kami.

Mengapa tidak mencari kejelasan saja:

$ for X in {a,b,c}; do echo $X; done

Anda bahkan bisa menjadi babi utuh dan memasukkan beberapa baris baru dan sedikit membukanya sehingga Anda akan selalu bisa memahami apa yang Anda coba lakukan.


4
@ peth - Saya berasumsi ini adalah contoh yang disederhanakan. Jika memang sesederhana daftar, maka Anda benar. Jika itu sesuatu yang lebih seperti file-{r,b,g}{m,n,o}{x,y.z}.foomaka lebih baik menggunakan formulir pendek daripada menghitung semua 27 nilai.
unpythonic

@ peth - Saya pikir itu adalah pertanyaan tindak lanjut yang bagus.
unpythonic

Saya sudah lama ingin mengetahui hal ini, terima kasih! :)
Sirex

1
Yah, use case adalah program yang tidak menerima lebih dari satu file (misalnya), jadi di mana ekspansi tidak akan berfungsi. Oleh karena itu, alangkah baiknya untuk dapat menjalankan program dengan mudah beberapa kali saja. The forbekerja untuk ini, tapi masih lebih mengetik: P
houbysoft

Saya menggunakannya untuk membersihkan beberapa cabang git:eval git branch -d \{ branch-a, branch-b }\;
Kit

3

Berdasarkan jawaban yang dipilih Mark Mann , saya dapat menurunkan lebih lanjut contoh ini, yang sangat bagus:

$ eval echo\ category_{17,32,33}.properties\{,.bak\}\;
category_17.properties category_17.properties.bak
category_32.properties category_32.properties.bak
category_33.properties category_33.properties.bak

Apa yang ditampilkan, adalah ketika Anda menggunakan beberapa kejadian ekspansi brace dalam satu garis, contoh asli Mark akan mencetak setiap variasi secara individual. Sebagai gantinya, saya ingin menggunakan jawabannya untuk memindahkan / mengganti nama banyak file. Untuk memastikan bahwa output cocok dengan format yang mvbiasanya diharapkan ( mv oldfilename newfilename), saya lolos dari ekspansi brace yang kedua, sehingga tidak akan dievaluasi sampai setelaheval perintah awal dijalankan.

Ketika output di atas muncul seperti yang diharapkan, saya kemudian dapat menjalankan perintah berikut:

$ eval mv\ category_{17,32,33}.properties\{,.bak\}\;
$ ls
category_17.properties.bak  category_32.properties.bak  category_33.properties.bak

Terima kasih banyak untuk Mark atas jawaban aslinya. Harap beri suara pada jawabannya jika Anda suka jawabannya memungkinkan saya untuk melakukan :-)


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.