2016-03-12 2 views
1

У меня есть main_script.sh, который вызывается sub_script.Передача параметра из одного сценария в другой - Сценарий оболочки

У меня есть переменная в sub_script, который я хотел бы получить доступ в главном скрипте

Я пытался «экспорт» и «окр» с переменной, но когда я пытаюсь повторить его в main_script я не получение значений.

, например:

sub_script.sh

export a=hello 
echo $a 

main_script.sh

$PGMHOME/sub_script.sh > output_file 
echo $a 

FYI: sub_script.sh выполняется правильно, потому что я получаю значение 'а' в output_file Но когда Я повторяю значение a в main_script, я не получаю его.

пс: Я знаю, что могу назначить переменную непосредственно в main_sript.sh, но это всего лишь пример, и у меня есть большая обработка сделано в sub_script.sh

ответ

1

Среды (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 
+0

Я бы дал «исходный индекс» в качестве основного совета, не могу сказать ничего о 'eval'. Ваш последний код запутан, когда вы еще не понимаете точки: у вас есть 12 точек, которые заменяют что-то еще и 2 точки, которые нужно воспринимать буквально. –

+0

Хорошая точка в деталях '...'; Я заменил их комментариями. – torek

0

Параметры для сценария передаются как $ 1, $ 2 и т.д. Вы можете позвонить main_script.sh из sub_script.sh и вызвать main_script.sh снова.

main_script.sh

#!/bin/sh 
echo "main_script" 
./sub_script.sh "hello world!" 

sub_script.sh

#!/bin/sh 
if [ "${1}" = "" ]; then 
    echo "calling main_script" 
    ./main_script.sh 
else 
    echo "sub_script called with parameter ${1}" 
fi 

./main_script.sh

вызова main_script
main_script
sub_script вызывается с параметром привет мир!

Смежные вопросы