Há algum tempo, decidi aliaspor esse tipo de trabalho. Aqui está outra resposta minha:
Às vezes, pode ser possível separar a avaliação e a execução de tais declarações. Por exemplo, aliaspode 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 $varvariável que está avaliando não contiver bytes que não correspondam aos 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 a chamada do novo a aliaspartir de um contexto de nome de variante citado - não exatamente para a atribuição. E evalsó é chamado se a aliasdefinição anterior for bem-sucedida e, embora eu saiba que muitas implementações diferentes aceitem muitos tipos diferentes de valores para nomes de alias, ainda não encontrei um shell que aceite um completamente vazio .
A definição no alias é para _$var, no entanto, e isso garante que nenhum valor significativo do ambiente seja substituído. Não conheço nenhum valor de ambiente notável que comece com _ e geralmente é uma aposta segura para uma declaração semi-privada.
De qualquer forma, se a definição de alias for bem-sucedida, ela declarará um alias nomeado para $varo valor de. E evalsó chamará isso aliasse também não começar com um número - senão evalobtém apenas um argumento nulo. Então, se ambas as condições forem atendidas evalchamadas as aliase a definição variável guardado na aliasé feito, após o qual o novo alias é prontamente removida da tabela de hash.
Também útil aliasnesse contexto é que você pode imprimir seu trabalho. aliasimprimirá uma declaração duplamente citada de segurança para reexecução quando solicitada.
sh -c "IFS=\'
alias q=\"\$*\" q" -- \
some args which alias \
will print back at us
SAÍDA
q='some'"'"'args'"'"'which'"'"'alias'"'"'will'"'"'print'"'"'back'"'"'at'"'"'us'