Vor einiger Zeit habe ich mich alias
fü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 alias
kann ein Befehl vorab ausgewertet werden. Im folgenden Beispiel wird die Variablendefinition in einem Alias gespeichert, der nur dann erfolgreich deklariert werden kann, wenn die $var
auszuwertende 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
eval
wird hier verwendet, um das Aufrufen des Neuen alias
aus einem Kontext mit dem angegebenen Variablennamen heraus zu handhaben - nicht für die genaue Zuweisung. Und eval
wird überhaupt nur aufgerufen, wenn die vorherige alias
Definition 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 $var
Werts deklariert . Und eval
ruft das nur auf, alias
wenn es auch nicht mit einer Zahl beginnt - sonst eval
bekommt man nur ein Nullargument. Wenn also beide Bedingungen erfüllt sind, werden die eval
Aufrufe alias
und die in der gesicherte Variablendefinition durchgeführt alias
, wonach der neue Alias sofort aus der Hash-Tabelle entfernt wird.
alias
In diesem Zusammenhang ist es auch nützlich, dass Sie Ihre Arbeit drucken können. alias
gibt 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'