Meskipun benar bahwa evalselalu perlu didekati dengan hati-hati, eval echokonstruksi 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 evalbaris 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 bashyang memungkinkan cara yang lebih rapi untuk mencapai hal semacam ini. Namun bagaimanapun, penggunaan evalini aman karena argumennya adalah semua string tetap yang tidak mengandung ekspansi parameter.