Деякий час тому я влаштувався на aliasтаку роботу. Ось ще одна моя відповідь:
Однак іноді можливе відокремлення оцінки та виконання таких тверджень. Наприклад, aliasможе використовуватися для попередньої оцінки команди. У наступному прикладі визначення змінної зберігається в псевдонімі, який можна успішно оголосити, лише якщо $varзмінна, яку вона оцінює, не містить байтів, що не відповідають буквено-цифровим знакам ASCII або _.
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тут використовується для обробки виклику нового aliasз контекстуваного контексту varname - не для призначення саме. І evalназивається взагалі лише тоді, коли попереднійalias визначення було успішним, і, хоча я знаю, що багато різних реалізацій приймуть безліч різних видів значень для псевдонімів, я ще не знайшов оболонки, яка б прийняла повністю порожню .
Визначення в псевдонімі призначене для _$var , однак, це для того, щоб не було записано жодних значущих значень середовища. Я не знаю жодних примітних значень середовища, що починаються з _, і зазвичай це безпечна ставка для напівприватного декларування.
У будь-якому випадку, якщо визначення псевдоніма буде успішним, він оголосить псевдонім, названий для $var's значення. І evalлише зателефоную, що aliasякщо воно також не починається з числа - інше evalотримує лише нульовий аргумент. Отже, якщо обидві умови виконуються, evalвикликується aliasі визначене значення змінної, збережене у aliasфайлі, після чого новий псевдонім негайно видаляється з хеш-таблиці.
aliasУ цьому контексті також корисно те , що ви можете надрукувати свою роботу. aliasбуде надруковано подвійне цитування заяви про безпечне для оболонки виконання .
sh -c "IFS=\'
alias q=\"\$*\" q" -- \
some args which alias \
will print back at us
ВИХІД
q='some'"'"'args'"'"'which'"'"'alias'"'"'will'"'"'print'"'"'back'"'"'at'"'"'us'