Среды (export
-ED переменные) передаются только «вниз "(от родительского к дочернему процессу), а не вверх.
Это означает, что если вы хотите запустить подстрочный скрипт из основного сценария в качестве процесса, подзаписчик должен где-то писать имена и значения, чтобы родительский процесс (основной скрипт) могут читать и обрабатывать их.
Есть много способов сделать это, в том числе просто распечатывая их на стандартный вывод и, родительский сценарий eval
результата:
eval $(./sub_script)
Есть множество подводных камней в этом (в том числе, конечно, что к югу -script может печатать rm -rf $HOME
, и основной скрипт выполнит это, конечно, под-скрипт может просто сделать это напрямую, но еще проще случайно напечатать что-то плохое, чем случайно сделать что-то плохое, поэтому это служит иллюстрацией). Обратите внимание, что суб-скрипт должен тщательно цитировать вещи:
#! /bin/sh
# sub-script
echo a=value for a
Когда eval
-е изд, это не удается, потому что value for a
разбивается на границах слов и eval
с запуском for a
с a=value
набора. Суб-скрипт должен использовать что-то более, как:
echo a=\'value for a\'
так, что основной сценарий eval $(./sub_script)
видит цитируемое назначение.
Если субсценару необходимо отправить вывод на стандартный вывод, ему необходимо будет написать свои параметры переменной в другом месте (возможно, во временном файле, возможно, в файловом дескрипторе, установленном в главном скрипте). Обратите внимание, что если вывод отправляется в файл - это включает в себя stdout, действительно - основной скрипт может прочитать файл тщательно (вместо использования простого eval
).
Другая альтернатива (используется только в некоторых, не во всех случаях) - это источник подзапись из основного сценария. Это позволяет суб-скрипту получить доступ ко всем из основного сценария напрямую. Это, как правило, самый простой метод, и поэтому часто лучший. Для того, чтобы источник суб-скрипт, который вы можете использовать команду .
:
#! /bin/sh
# main script
# code here
. ./sub_script # run commands from sub_script
# more code here
Я бы дал «исходный индекс» в качестве основного совета, не могу сказать ничего о 'eval'. Ваш последний код запутан, когда вы еще не понимаете точки: у вас есть 12 точек, которые заменяют что-то еще и 2 точки, которые нужно воспринимать буквально. –
Хорошая точка в деталях '...'; Я заменил их комментариями. – torek