Qualche tempo fa ho optato aliasper questo tipo di lavoro. Ecco un'altra mia risposta:
Tuttavia, a volte può essere possibile separare la valutazione e l'esecuzione di tali dichiarazioni. Ad esempio, aliaspuò essere utilizzato per pre-valutare un comando. Nell'esempio seguente la definizione della variabile viene salvata in un alias che può essere dichiarato correttamente solo se la $varvariabile che sta valutando non contiene byte che non corrispondono a caratteri alfanumerici 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
evalviene utilizzato qui per gestire l'invocazione del nuovo aliasda un contesto varname tra virgolette, non esattamente per l'assegnazione. E evalviene chiamato solo se la aliasdefinizione precedente ha esito positivo e mentre so che molte implementazioni diverse accetteranno molti tipi diversi di valori per i nomi di alias, non ho ancora trovato una shell che accetti una completamente vuota .
La definizione all'interno dell'alias è _$var, tuttavia, per garantire che non vengano sovrascritti valori ambientali significativi. Non conosco valori ambientali degni di nota che iniziano con un _ ed è generalmente una scommessa sicura per una dichiarazione semi-privata.
Comunque, se la definizione di alias ha esito positivo, dichiarerà un alias chiamato per $varil valore di. E evallo chiamerò solo aliasse anche non inizia con un numero - altrimenti evalottiene solo un argomento nullo. Pertanto, se vengono soddisfatte entrambe le condizioni, viene evaleffettuata la aliasdefinizione della variabile salvata in alias, dopodiché il nuovo alias viene prontamente rimosso dalla tabella hash.
Anche utile aliasin questo contesto è che puoi stampare il tuo lavoro. aliasstamperà una dichiarazione Safe-for-Shell-Rexecution quotata doppiamente quando richiesto.
sh -c "IFS=\'
alias q=\"\$*\" q" -- \
some args which alias \
will print back at us
PRODUZIONE
q='some'"'"'args'"'"'which'"'"'alias'"'"'will'"'"'print'"'"'back'"'"'at'"'"'us'