Zwar muss eval
immer mit Vorsicht vorgegangen werden, aber die eval echo
Konstruktion ist nicht immer sinnlos und kann sicher verwendet werden. Ich brauchte es kürzlich, um mehrere Klammererweiterungen in der Reihenfolge zu bewerten, in der ich sie benötigte.
bash
Führt mehrere Klammererweiterungen von links nach rechts durch
xargs -I_ cat _/{11..15}/{8..5}.jpg
erweitert um
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
aber ich musste die zweite Klammer-Erweiterung zuerst machen und nachgeben
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
Das Beste, was ich mir dafür einfallen lassen konnte, war
xargs -I_ cat $(eval echo _/'{11..15}'/{8..5}.jpg)
Dies funktioniert, weil die einfachen Anführungszeichen den ersten Satz von geschweiften Klammern vor einer Erweiterung während des Parsens der eval
Befehlszeile schützen und sie durch die von aufgerufene Subshell erweitern lassen eval
.
Möglicherweise gibt es ein ausgeklügeltes Schema mit geschachtelten Klammererweiterungen, das dies in einem Schritt ermöglicht, aber wenn es etwas gibt, bin ich zu alt und dumm, um es zu sehen. Es gibt auch andere Muscheln bash
, mit denen sich solche Dinge aufgeräumter erreichen lassen. Diese Verwendung von eval
ist jedoch in jedem Fall sicher, da es sich bei den Argumenten um feste Zeichenfolgen handelt, die keine Parametererweiterungen enthalten.