Chociaż prawdą jest, że evalzawsze należy podchodzić ostrożnie, eval echokonstrukcja nie zawsze jest bezcelowa i można z niej bezpiecznie korzystać. Ostatnio potrzebowałem go, aby uzyskać ocenę wielu rozszerzeń nawiasów w kolejności, w jakiej ich potrzebowałem.
bash wykonuje wiele rozszerzeń nawiasów od lewej do prawej, więc
xargs -I_ cat _/{11..15}/{8..5}.jpg
rozwija się do
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
ale najpierw potrzebowałem drugiego rozszerzenia nawiasu klamrowego, ustępując
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
Najlepsze, co mogłem wymyślić, żeby to zrobić
xargs -I_ cat $(eval echo _/'{11..15}'/{8..5}.jpg)
Działa to, ponieważ pojedyncze cudzysłowy chronią pierwszy zestaw nawiasów klamrowych przed rozwinięciem podczas analizowania evalwiersza poleceń, pozostawiając je do rozszerzenia przez wywołaną podpowłokę eval.
Może być jakiś sprytny schemat obejmujący zagnieżdżone rozszerzenia nawiasów klamrowych, który pozwala to zrobić w jednym kroku, ale jeśli jest, jestem za stary i głupi, aby to zobaczyć. Istnieją również inne powłoki, bashktóre pozwalają na bardziej uporządkowane sposoby osiągnięcia tego rodzaju rzeczy. Ale w każdym razie takie użycie evaljest bezpieczne, ponieważ wszystkie jego argumenty są stałymi ciągami znaków, które nie zawierają rozszerzeń parametrów.