Hace algún tiempo me decidí aliaspor 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, aliasse 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 $varvariable 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
evalse usa aquí para manejar la invocación de lo nuevo aliasdesde un contexto de nombre de variable entre comillas, no para la asignación exactamente. Y evalsolo se llama si la aliasdefinició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 .
_$varSin 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 $varvalor. Y evalsolo llamará a eso aliassi tampoco comienza con un número; de lo contrario, evalsolo obtiene un argumento nulo. Entonces, si se cumplen ambas condiciones, se evalllama a la aliasdefinició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 aliasen este contexto es que puede imprimir su trabajo. aliasimprimirá 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'