Как избежать столкновения / загрязнения пространства имен в сценарии, предназначенном для поиска?
Я хочу реализовать скрипт foo.sh
который завершается исполнением командной bar
(с некоторыми аргументами). Панель команд изменяет текущую среду оболочки, а это значит, что foo.sh
должен быть найден 1 . (BTW, реализация bar
полностью вне моего контроля.)
Цель большей части кода в foo.sh
– вычислить аргументы, которые будут переданы в bar
.
- Как напечатать код функции оболочки в терминале?
- Запуск одной команды за другой в zsh при нажатии Ctrl-C
- scp-шаблон не работает в zsh
- Для циклов в zsh и bash
- Что делает карет в zsh?
Чтобы сохранить foo.sh
достаточно удобочитаемым / поддерживаемым, я обнаружил, что должен определить много вспомогательных переменных. К сожалению, это создает основу для
- конфликты пространства имен (т.е. слияние существующих параметров)
- загрязнение пространства имен (т.е. загромождение окружающей среды избыточными параметрами)
Один из возможных способов избежать или, по крайней мере, смягчить эти проблемы – поставить большую часть foo.sh
в функцию (со всеми ее переменными, объявленными как local
), которая перекликается с подходящей строкой кода, которая будет отображаться в пределах вызывающий объем; например
{ __messy_calculation () { local xyz ... local bar_arg_1 bar_arg_2 ... ... echo "bar $bar_arg_1 bar_arg_2 ..." } eval "$( __messy_calculation )" } always { unfunction __messy_calculation }
Это устраняет проблему загрязнения пространства имен и уменьшает проблему столкновения пространства имен с именем функции. (Хотя я не большой поклонник использования eval).
Я полагаю, что эта ситуация достаточно общая, что уже существуют стандартные способы ее решения. Если это так, пожалуйста, дайте мне знать.
1 В случае, если мои рассуждения испорчены, позвольте мне добавить, что если я поместил весь код, включая вызов в bar
, в функцию, когда я выполняю эту функцию в командной строке, текущая среда остается незатронутой, что делает функцию бесполезный. Напротив, если я исхожу из строки, которая выполняет вызов в bar
, текущая среда изменяется, как ожидалось.
- zsh добавляет символ табуляции при автозаполнении
- Разделить массив Zsh от подоболочки по переводу строки
- Новые привязки клавиш в ZSH не сохраняются
- Всплывающее окно Python virtualenvwrapper и ZSH
- Как я могу автозаполнять каждый параметр по-другому?
- Возможно ли возобновить источник .bashrc и .zshrc И удалить функции один раз внутри них без перезапуска?
- zsh globbing - поиск файлов с повторяющимися строками имен файлов
- Увеличение / уменьшение числа в файле из (zsh) скрипта
One Solution collect form web for “Как избежать столкновения / загрязнения пространства имен в сценарии, предназначенном для поиска?”
Для переменных можно использовать анонимную функцию (как отмечено в комментарии выше). Это означает, что вы можете определить столько переменных, сколько хотите. Те, которые вы хотите скрыть от префикса вызывающего абонента с local
, те, которые вы хотите сообщить вызывающему абоненту, который вы обычно определяете:
function { local my_var=foo your_var=bar : ... }
Но для функций, которые не будут работать, поскольку они не могут быть объявлены local
. У меня была эта проблема в моем zshrc и я решил префикс всех имен моих «локальных» функций с короткой строкой (например, вы занимаете пространства имен на C) и для того, чтобы сделать подстановочный unfunction
в конце:
function foo-do-something () { : ... } function foo-do-some-more-stuff () { : ... } function foo-main () { local my_var=oof you_var=rab foo-do-something for bar foo-do-some-more-stuff with baz } foo-main unfunction -m 'foo-*'
По моему мнению, это не оптимальное решение (я бы предпочел локальные функции), но он работает для меня.
- О tun2socks (BadVPN) SOCKS proxy
- Не удалось подключиться к домену: не удалось установить типы шифрования машинного кебероса: Недостаточный доступ