Vor einiger Zeit habe ich mich aliasfür diese Art von Arbeit entschieden. Hier ist eine andere Antwort von mir:
Es kann jedoch manchmal möglich sein, die Auswertung und Ausführung solcher Anweisungen zu trennen. Zum Beispiel aliaskann ein Befehl vorab ausgewertet werden. Im folgenden Beispiel wird die Variablendefinition in einem Alias gespeichert, der nur dann erfolgreich deklariert werden kann, wenn die $varauszuwertende Variable keine Bytes enthält, die nicht mit ASCII-Alphanumerik oder _ übereinstimmen.
LC_OLD=$LC_ALL LC_ALL=C
for var do val=${var#*=} var=${var%%=*}
alias "${var##*[!_A-Z0-9a-z]*}=_$var=\$val" &&
eval "${var##[0-9]*}" && unalias "$var"
done; LC_ALL=$LC_OLD
evalwird hier verwendet, um das Aufrufen des Neuen aliasaus einem Kontext mit dem angegebenen Variablennamen heraus zu handhaben - nicht für die genaue Zuweisung. Und evalwird überhaupt nur aufgerufen, wenn die vorherige aliasDefinition erfolgreich ist, und obwohl ich weiß, dass viele verschiedene Implementierungen viele verschiedene Arten von Werten für Aliasnamen akzeptieren, habe ich noch keine Shell gefunden, die eine vollständig leere akzeptiert .
Die Definition innerhalb des Alias ist jedoch für _$var, und dies soll sicherstellen, dass keine signifikanten Umgebungswerte überschrieben werden. Ich kenne keine nennenswerten Umgebungswerte, die mit einem _ beginnen, und dies ist normalerweise eine sichere Option für halbprivate Deklarationen.
Wenn die Aliasdefinition erfolgreich ist, wird ein Alias mit dem Namen des $varWerts deklariert . Und evalruft das nur auf, aliaswenn es auch nicht mit einer Zahl beginnt - sonst evalbekommt man nur ein Nullargument. Wenn also beide Bedingungen erfüllt sind, werden die evalAufrufe aliasund die in der gesicherte Variablendefinition durchgeführt alias, wonach der neue Alias sofort aus der Hash-Tabelle entfernt wird.
aliasIn diesem Zusammenhang ist es auch nützlich, dass Sie Ihre Arbeit drucken können. aliasgibt eine doppelt zitierte Safe-for-Shell-Wiederausführungsanweisung aus , wenn Sie dazu aufgefordert werden.
sh -c "IFS=\'
alias q=\"\$*\" q" -- \
some args which alias \
will print back at us
AUSGABE
q='some'"'"'args'"'"'which'"'"'alias'"'"'will'"'"'print'"'"'back'"'"'at'"'"'us'