[12178]eval "$1" [114237] выполняет команду в текущем сценарии. Она может устанавливать и использовать переменные оболочки из текущего сценария, устанавливать переменные окружения для текущего сценария, устанавливать и использовать функции из текущего сценария, устанавливать текущий каталог, маску, ограничения и другие атрибуты для текущего сценария и так далее. [114238]bash -c "$1"[114239] выполняет команду в совершенно отдельном скрипте, который наследует переменные окружения, файловые дескрипторы и другое процессное окружение (но не передает обратно никаких изменений), но не наследует внутренние настройки оболочки (переменные оболочки, функции, опции, ловушки и т.д.). [12179] Есть другой способ, [114240](eval "$1")[114241], который выполняет команду в подоболочке: он наследует все от вызывающего скрипта, но не передает никаких изменений обратно. [12180]Например, предполагая, что переменная [114242]dir[114243] не экспортируется и [114244]$1[114245] является [114246]cd "$foo"; ls[114247], то:[12181]cd /starting/directory; foo=/somewhere/else; eval "$1"; pwd[114470] перечисляет содержимое [114471]/somewhere/else[114472] и печатает [114473]/somewhere/else[114474]. [12182]cd /starting/directory; foo=/somewhere/else; (eval "$1"); pwd[114476] перечисляет содержимое [114477]/somewhere/else[114478] и печатает [114479]/starting/else[114480]. [12183]cd /starting/directory; foo=/somewhere/else; bash -c "$1"; pwd[114482] перечисляет содержимое [114483]/starting/directory[114484] (поскольку [114485]cd ""[114486] не изменяет текущий каталог) и печатает [114487]/starting/directory[114488]. [12184]
27.01.2020, 19:35
Ссылка