Деякий час тому я влаштувався на 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'