Hace algún tiempo me decidí alias
por este tipo de trabajo. Aquí hay alguna otra respuesta mía:
Sin embargo, a veces puede ser posible separar la evaluación y la ejecución de tales declaraciones. Por ejemplo, alias
se puede usar para evaluar previamente un comando. En el siguiente ejemplo, la definición de la variable se guarda en un alias que solo puede declararse con éxito si la $var
variable que está evaluando no contiene bytes que no coincidan con los caracteres alfanuméricos ASCII o _.
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
se usa aquí para manejar la invocación de lo nuevo alias
desde un contexto de nombre de variable entre comillas, no para la asignación exactamente. Y eval
solo se llama si la alias
definición anterior es exitosa, y aunque sé que muchas implementaciones diferentes aceptarán muchos tipos diferentes de valores para nombres de alias, aún no he encontrado un shell que acepte uno completamente vacío .
_$var
Sin embargo, la definición dentro del alias es para , y esto es para garantizar que no se sobrescriban valores de entorno significativos. No conozco ningún valor de entorno notable que comience con un _ y, por lo general, es una apuesta segura para la declaración semiprivada.
De todos modos, si la definición de alias es exitosa, declarará un alias con el nombre del $var
valor. Y eval
solo llamará a eso alias
si tampoco comienza con un número; de lo contrario, eval
solo obtiene un argumento nulo. Entonces, si se cumplen ambas condiciones, se eval
llama a la alias
definición de variable y se guarda en elalias
, después de lo cual el nuevo alias se elimina rápidamente de la tabla hash.
También útil alias
en este contexto es que puede imprimir su trabajo. alias
imprimirá una declaración de ejecución segura de cotización doblemente citada cuando se le solicite .
sh -c "IFS=\'
alias q=\"\$*\" q" -- \
some args which alias \
will print back at us
SALIDA
q='some'"'"'args'"'"'which'"'"'alias'"'"'will'"'"'print'"'"'back'"'"'at'"'"'us'