Meskipun benar bahwa eval
selalu perlu didekati dengan hati-hati, eval echo
konstruksi tidak selalu sia-sia dan dapat digunakan dengan aman. Saya baru-baru ini membutuhkannya untuk mendapatkan beberapa ekspansi brace dievaluasi dalam urutan yang saya butuhkan.
bash
melakukan beberapa ekspansi brace dari kiri ke kanan, jadi
xargs -I_ cat _/{11..15}/{8..5}.jpg
meluas ke
xargs -I_ cat _/11/8.jpg _/11/7.jpg _/11/6.jpg _/11/5.jpg _/12/8.jpg _/12/7.jpg _/12/6.jpg _/12/5.jpg _/13/8.jpg _/13/7.jpg _/13/6.jpg _/13/5.jpg _/14/8.jpg _/14/7.jpg _/14/6.jpg _/14/5.jpg _/15/8.jpg _/15/7.jpg _/15/6.jpg _/15/5.jpg
tapi saya perlu ekspansi brace kedua dilakukan pertama, menghasilkan
xargs -I_ cat _/11/8.jpg _/12/8.jpg _/13/8.jpg _/14/8.jpg _/15/8.jpg _/11/7.jpg _/12/7.jpg _/13/7.jpg _/14/7.jpg _/15/7.jpg _/11/6.jpg _/12/6.jpg _/13/6.jpg _/14/6.jpg _/15/6.jpg _/11/5.jpg _/12/5.jpg _/13/5.jpg _/14/5.jpg _/15/5.jpg
Yang terbaik yang bisa saya lakukan untuk melakukan itu adalah
xargs -I_ cat $(eval echo _/'{11..15}'/{8..5}.jpg)
Ini bekerja karena tanda kutip tunggal melindungi set kawat gigi pertama dari ekspansi selama penguraian eval
baris perintah, membiarkannya diperluas oleh subkulit yang dipanggil oleh eval
.
Mungkin ada beberapa skema licik yang melibatkan ekspansi penjepit bersarang yang memungkinkan ini terjadi dalam satu langkah, tetapi jika ada saya terlalu tua dan bodoh untuk melihatnya. Ada juga cangkang selain bash
yang memungkinkan cara yang lebih rapi untuk mencapai hal semacam ini. Namun bagaimanapun, penggunaan eval
ini aman karena argumennya adalah semua string tetap yang tidak mengandung ekspansi parameter.