Chociaż prawdą jest, że eval
zawsze należy podchodzić ostrożnie, eval echo
konstrukcja 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 eval
wiersza 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, bash
które pozwalają na bardziej uporządkowane sposoby osiągnięcia tego rodzaju rzeczy. Ale w każdym razie takie użycie eval
jest bezpieczne, ponieważ wszystkie jego argumenty są stałymi ciągami znaków, które nie zawierają rozszerzeń parametrów.