Saya memiliki program UNIX kotak hitam yang digunakan dalam shell Bash yang membaca kolom data dari stdin, memprosesnya (menerapkan efek smoothing) kemudian menghasilkan stdout. Saya menggunakannya oleh pipa UNIX, seperti
generate | smooth | plot
Untuk lebih smoothing, saya bisa mengulangi smooth, jadi itu akan dipanggil dari baris perintah Bash sebagai
generate | smooth | smooth | plot
atau bahkan
generate | smooth | smooth | smooth | smooth | smooth | smooth | smooth | smooth | smooth | smooth | plot
Ini semakin tidak sehat. Saya ingin membuat pembungkus Bash untuk dapat menyalurkan ke smooth
dan memberi makan outputnya kembali ke instance baru smooth
beberapa kali, seperti
generate | newsmooth 5 | plot
dari pada
generate | smooth | smooth | smooth | smooth | smooth | plot
Upaya pertama saya adalah skrip Bash yang menghasilkan file temp di direktori saat ini dan menghapusnya, tetapi itu berubah jelek ketika saya tidak berada di direktori dengan akses tulis, dan juga meninggalkan file sampah ketika terganggu.
Tidak ada argumen untuk smooth
program ini.
Apakah ada cara yang lebih elegan untuk "membungkus" program semacam itu untuk mengukur jumlah panggilan?
sumber
Jawaban:
Anda bisa membungkusnya dalam fungsi rekursif:
Anda akan menggunakan ini sebagai
yang akan setara dengan
sumber
Jika Anda mampu mengetikkan koma sebanyak jumlah
smooth
perintah yang Anda inginkan, Anda dapat mengambil keuntungan dari Brace Expansion yang dipisahkan oleh koma shell.TL; DR
Seluruh baris perintah untuk case sampel Anda adalah:
catatan:
smooth |
|
sebelumnyaplot
karena itu termasuk yang terakhirsmooth |
string diproduksi oleh Brace Expansionsmooth
, selama Anda dapat memasukkannya dengan benar di dalam bagian tetap yang dikutip yang mendahului kurung kurawal terbuka; dalam hal apa pun ingat bahwa Anda akan memberikan mereka untuk semua pengulangan perintahBagaimana itu bekerja
Ekspansi Brace yang dipisahkan dengan koma memungkinkan Anda untuk menghasilkan string secara dinamis, masing-masing terbuat dari bagian tetap yang ditentukan ditambah bagian variabel yang ditentukan. Ini menghasilkan string sebanyak ada bagian variabel yang ditunjukkan, seperti
a{b,c,d}
menghasilkanab ac ad
.Trik kecil di sini adalah bahwa jika Anda lebih suka membuat daftar bagian variabel kosong , yaitu dengan hanya koma di dalam kurung kurawal, Brace Expansion hanya akan menghasilkan salinan dari bagian tetap saja. Contohnya:
akan menghasilkan:
Perhatikan bahwa 4 koma menghasilkan 5
smooth
string. Itulah cara kerja Brace Expansion ini: menghasilkan string sebanyak koma ditambah satu.Tentu saja dalam kasus Anda, Anda juga perlu
|
memisahkan masing-masingsmooth
, jadi tambahkan saja di bagian tetap tetapi berhati-hatilah untuk mengutipnya dengan benar agar shell tidak menafsirkannya sekaligus. Itu adalah:akan menghasilkan:
Berhati-hatilah selalu menempatkan bagian tetap yang berbatasan langsung dengan brace terbuka, yaitu tidak ada ruang antara
'
dan{
.(Perhatikan juga bahwa untuk membentuk bagian tetap, Anda juga dapat menggunakan tanda kutip ganda dan bukan tanda kutip tunggal, jika Anda perlu memperluas variabel shell di bagian tetap. Hanya berhati-hati dengan pelolosan ekstra yang diperlukan saat karakter khusus beberapa shell muncul di dalam string yang dikutip ganda).
Pada titik ini Anda perlu
eval
diterapkan ke string itu untuk membuat shell akhirnya menafsirkannya sebagai perintah pipelined seharusnya.Jadi, untuk menjumlahkan semuanya, seluruh baris perintah untuk case sampel Anda adalah:
sumber
eval
saat seseorang memberikan string yang tidak tepercaya, tidak disanitasi, untuk dievaluasi, yaitu saat digunakan dengan variabel yang dapat membawa konten "tidak dikenal" seperti kasus yang Anda tautkan. Di sisi lain,eval
bisa juga sangat berguna untuk "plumbing" perintah yang cepat, terutama ketika digunakan pada prompt, seperti halnya case yang ada, di manaeval
input hanya berupa string literal yang diketik secara manual oleh pengguna di orangeval str
dengan sesuatu yang sok & bodoh. /dev/stdin <<<str
. Tidak hanya akan membuat kesan pada orang bodoh, itu juga akan menjaga @CharlesDuffy dari punggung Anda ;-)