2014-11-13 3 views
2

У меня есть сценарий оболочки (назовем его parent.sh), который вызывает другой скрипт оболочки (child.sh), передавая ему аргумент.Обмен переменными между сценариями оболочки

Детский скрипт выполняет некоторую работу и устанавливает значение в переменной с именем create_sql. Я хочу получить доступ к этой переменной create_sql из родительского скрипта, который ее вызвал.

Я зову ребенка скрипт внутри родительского сценария, как это:

./child.sh "$dictionary"

и сразу после этого у меня есть строка:

echo "The resulting create script is: "$create_sql

Однако, нет никакого значения однако, в дочернем скрипте я делаю то же самое, и переменная определенно задана.

Как я могу заставить это работать, чтобы читать переменные, созданные дочерним скриптом?

+1

Вкратце, вы не можете этого сделать, если вы не сделаете что-то вроде '. ./child.sh "$ dictionary" (или в Bash, подражая оболочке C, 'source ./child.sh" $ dictionary "). Это считывает и исполняет скрипт в среде текущей оболочки, но может взаимодействовать с другими переменными в скрипте 'parent.sh' - между сценариями нет изоляции. В противном случае дочерний процесс не может безопасно установить среду родительской оболочки.(Если вы хотите сделать это безумно, вы можете запустить дочернюю оболочку отладчика, подключиться к процессу родительской оболочки и установить среду таким образом, но «безумный» вежлив). –

+0

Хорошо, как я могу реализовать эту функциональность? Должен ли я просто поместить содержимое дочернего скрипта в родительский скрипт? Это была моя попытка модуляции сценариев. – jcm

+1

Возможно, лучший способ - это получить «child.sh» echo значение, которое вы хотите в '$ create_sql', а затем вы используете' create_sql = $ (./ child.sh «$ dictionary») 'без пробелов вокруг оператора присваивания. –

ответ

4

Сжато, вы не можете иметь ребенка сценарий установить переменную в родительский сценарий, если вы делаете что-то вроде:

. ./child.sh "$dictionary" 

(или в Bash, имитирующий оболочку C, source ./child.sh "$dictionary"). Это считывает и исполняет скрипт в среде текущей оболочки, но может изменять любую другую переменную в сценарии parent.sh; между сценариями нет никакой изоляции. В противном случае дочерний процесс не может безопасно установить среду родительской оболочки. (Если вы хотите сделать это безумно, вы можете иметь дочернюю оболочку, запускающую отладчик, присоединяться к процессу родительской оболочки и устанавливать среду таким образом, но называть ее «безумным» вежливым).

Возможно, лучший способ, чтобы получить выход из ребенка прятали в переменной в родительском скрипте иметь child.sh эхо значение, которое вы хотите в $create_sql, а затем использовать

create_sql=$(./child.sh "$dictionary") 
echo "The resulting create script is: $create_sql" 

без пробелов вокруг оператор присваивания. Обратите внимание, что echo включает переменную внутри двойных кавычек; это сохранит внутренний интервал (включая новые строки) в значении переменной. Как написано в вопросе, переменная сглажена в поток, разделенный пробелом «слов» (последовательности не-пробелов), теряя любое внутреннее расстояние.

0

Использовать источник Люк! Исходное слово (или.) Позволяет запускать скрипт, как если бы он находился в текущей оболочке. Остерегайтесь, ваш сценарий и источник являются «замужними» :-), сценарий с исходными текстами имеет полный доступ ко всем переменным к лучшему или к худшему ...

Другие способы подразумевают, что модифицированный сценарий для вызова - это результат формат потока, который будет прочитан абонентом с использованием script params | read VAR или RESULT=$(SCRIPT params) и вторя результаты от называемого сценария