Почему удар даже анализирует/выполняет материал, вставленный в переменную среды?

Можно использовать uniq для сворачивания несколько инстанцируют пустых строк в одну пустую строку, но она также свернет строки, которые содержат текст, если они - то же и друг ниже друга.

9
28.09.2014, 02:09
1 ответ

Когда скрипт вызывает другой скрипт, переменные родительского скрипта могут быть экспортированы, и тогда они будут видны в дочернем скрипте. Экспорт функций является очевидным обобщением: экспортируйте функцию из родительского скрипта, сделайте ее видимой в дочернем.

Окружение - это единственный удобный способ передачи произвольных данных дочерним процессам. Данные должны быть преобразованы в строки, не содержащие нулевых байтов, что не представляет сложности для функций оболочки. Существуют и другие потенциальные методы, такие как блоки общей памяти или временные файлы, передаваемые через файловые дескрипторы, но это может привести к проблемам с промежуточными программами, которые не знают, что с ними делать, или закроют их. Программы ожидают запуска в среде, содержащей переменные, о которых они не знают или не заботятся, поэтому они не будут перезаписывать или стирать их.

Выбор использования имени функции в качестве имени переменной окружения является странным. Во-первых, это означает, что экспортируемая переменная конфликтует с экспортируемой функцией с тем же именем.

Экспортируемые функции - это старая функция. Функции были добавлены в оболочку Борна в SVR2, а экспортированные функции в оболочке версии 8 , выпущенной в том же году (1984). В этой оболочке переменные и функции использовали одно и то же пространство имён. Я не знаю, как работал экспорт функций. Оболочка Heirloom shell основана на варианте Борна, который имеет функции, но не экспортирует их.

ATT ksh предположительно поддерживает экспорт функций, но, глядя на источник или играя с ним, я не вижу, что это так, начиная с ksh93u.

env -i /usr/bin/ksh -c 'f=variable; f () { echo function; }; typeset -fx f; /usr/bin/env; ksh -c f'
_=*25182*/usr/bin/env
PWD=/home/gilles
SHLVL=1
A__z="*SHLVL
ksh: f: not found

Клоны общественного достояния Ksh (pdksh, mksh), dash и zsh не поддерживают функции экспорта.

4
27.01.2020, 20:07

Теги

Похожие вопросы