Algum tempo atrás eu me decidi por alias
para esse tipo de trabalho. Aqui está outra resposta minha:
Às vezes, é possível separar a avaliação e execução de tais declarações. Por exemplo, alias
pode ser usado para pré-avaliar um comando. No exemplo a seguir, a definição da variável é salva em um alias que só pode ser declarado com êxito se a variável $var
que está avaliando não contiver bytes que não correspondam a alfanuméricos ASCII ou _.
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
é usado aqui para manipular o novo alias
de um contexto varname citado - não exatamente para a atribuição. E eval
só é chamado se a definição alias
anterior for bem-sucedida e, embora eu saiba que muitas implementações diferentes aceitarão muitos tipos diferentes de valores para nomes de alias, ainda não encontrei uma casca que aceitará um completamente vazio.
A definição dentro do alias é para _$var
, no entanto, e isso é para garantir que nenhum valor de ambiente significativo seja gravado. Eu não conheço nenhum valor de ambiente digno de nota começando com um _ e normalmente é uma aposta segura para uma declaração semi-privada.
De qualquer forma, se a definição do alias for bem-sucedida, ela declarará um alias nomeado para o valor de $var
. E eval
só chamará esse alias
se também não começar com um número - senão eval
obtém apenas um argumento nulo. Portanto, se ambas as condições forem atendidas, eval
chama o alias
e a definição da variável salva no alias
é feita, após o qual o novo alias é prontamente removido da tabela de hash.
Também é útil sobre alias
neste contexto que você pode imprimir seu trabalho. alias
imprimirá uma declaração segura para shell-rexecution duplamente citada quando for solicitada.
sh -c "IFS=\'
alias q=\"\$*\" q" -- \
some args which alias \
will print back at us
OUTPUT
q='some'"'"'args'"'"'which'"'"'alias'"'"'will'"'"'print'"'"'back'"'"'at'"'"'us'