Shellshock ошибка в Баш работает путем переменных окружения. Честно говоря, я был удивлен тем, что есть такая особенность, как:
"передача определений функций через env vars"
Поэтому этот вопрос, хотя, может быть, и не совсем сформулированный, состоит в том, чтобы задать пример или случай, в котором было бы необходимо иметь эту функцию?
Бонус. У других оболочек зш, тире и т. Д. Тоже есть эта функция?
bash
environment-variables
function
shellshock
humanityANDpeace
источник
источник
parallel
распространяет определения функций, если он вызывает несколько экземпляров bash. Если бы не таким образом, он должен был бы записать их в файл, который будет считывать каждый вызванный экземпляр, и тогда вам придется иметь дело с такими проблемами, как, когда этот файл может быть удален..dot
тот же файл, что и старая оболочка. Вот как это делается - и это имеет смысл - или вы передаете новой оболочке файл в качестве ввода приexec
загрузке. как только он будет прочитан, файл все равно кэшируется ядром.Ответы:
Когда скрипт вызывает другой скрипт, переменные родительского скрипта можно экспортировать, и тогда они будут видны в дочернем скрипте. Экспорт функций является очевидным обобщением: экспортируйте функцию из родительской, сделайте ее видимой в дочерней.
Среда является единственным удобным способом, которым процесс может передавать произвольные данные своим дочерним элементам. Данные должны быть упорядочены в строки, которые не содержат нулевых байтов, что не составляет труда для функций оболочки. Существуют и другие потенциальные методы, такие как блоки совместно используемой памяти или временные файлы, передаваемые через файловые дескрипторы, но они могут вызвать проблемы с промежуточными программами, которые не знают, что с ними делать, или закрывают их. Программы ожидают запуска в среде, содержащей переменные, которые они не знают или не заботятся, поэтому они не будут перезаписывать или стирать их.
Выбор использования имени функции в качестве имени переменной среды является странным. С одной стороны, это означает, что экспортируемая переменная конфликтует с экспортируемой функцией с тем же именем.
Экспортируемые функции - старая особенность. Функции были добавлены в оболочку Bourne в SVR2 , а экспортированные функции были добавлены в оболочку версии 8 в том же году (1984). В этой оболочке переменные и функции использовали одно и то же пространство имен. Я не знаю, как работал экспорт функций. Heirloom оболочки основана на варианте Bourne , который имеет функции , но не экспортировать их.
ATT ksh предположительно поддерживает экспорт функций, но, глядя на источник или играя с ним, я не вижу, что он делает, начиная с ksh93u.
Общедоступные клоны Ksh (pdksh, mksh), dash и zsh не поддерживают функции экспорта.
источник
BASH_FUNC_f%%=() { echo hi }
. Зачем bash анализировать другие переменные окружения? С чего бы это даже разбирать,BASH_FUNC_g%%
когда я только звонюf
? (По-видимому, до выстрела, переменная окружения только что была вызванаf
илиg
- но я все еще задаюсь вопросом, почемуg
был бы проанализирован, если бы я никогда не вызывалg
в моем сценарии)f
: (1) проверка на вызываемую функцию оболочкиf
, (2) проверка на вызываемую переменную окруженияf
и попытка ее проанализировать, (3) проверка каждыйPATH
компонент для исполняемого файла называетсяf
. Каким образом анализ каждой переменной среды в виде шелл-кода при запуске может показаться менее сложным?unset -f foo
, как bash больше не должен искать определение функцииfoo
в среде), при перечислении функций (как вы обрабатываете,declare -f
кроме чтения всех переменных среды?) и о чем еще я не думаю. Ваш дизайн кажется более легким, потому что вы оставили большую его часть. Напротив, все, что запускается при запуске, представляет собой один кусок кода, и после этого все просто работает.