Модераторы: powerfox, ZeeLax

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Bash - вернуть значение переменной из дочернего, процесса в родительский процесс 
V
    Опции темы
savigm
Дата 29.3.2009, 00:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 88
Регистрация: 15.12.2008
Где: г. Зеленоград

Репутация: нет
Всего: нет



Всем добрый день.

На форуме нет отдельной темы по Linux оболочке Bash, предлагаю все вопросы, касающиеся Bash обсуждать в этой теме.

Я изложу суть своего вопроса:
Есть первый скрипт, вызывающий второй. Второй является дочерним процессом первого. Вопрос: как можно вернуть значение переменной из второго скрипта (дочернего процесса) в первый (родительский процесс)? У меня пока только идея сохранить его в файл во втором скрипте и прочитать его в первом, но по-моему это кривое решение.
PM MAIL ICQ   Вверх
powerfox
Дата 29.3.2009, 00:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I wanna fork()
****


Профиль
Группа: Комодератор
Сообщений: 3990
Регистрация: 1.10.2005
Где: Санкт-Петербург

Репутация: 26
Всего: 97



Этой теме место в http://forum.vingrad.ru/forum/Linux-Unix-c...-questions.html

savigm, скрипт всё равно, что программа: по завершении остаётся лишь вывод (если быть точным, то 2) + статус завершения.
Обычно скрипты взаимодейтсвуют, через конвеер: script1 | script2, таким образом стандартный вывод script1 является стандартным вводом для script2.
Если же нужно, чтобы возвращалось значение, то нужна функция (и то, возвращает то же, что может вернуть скрипт).

Это сообщение отредактировал(а) powerfox - 30.3.2009, 01:18


--------------------
user posted image
PM WWW   Вверх
savigm
Дата 29.3.2009, 01:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 88
Регистрация: 15.12.2008
Где: г. Зеленоград

Репутация: нет
Всего: нет



powerfox, второй скрипт может передать первому значение и без функций - exit <код возврата>, но так как идеологически код возврата 0 - норм. звершение программы(скрипта), не 0 - код ошибки мне бы хотелось передавать значение из второго скрипта(вызванного из первого) через переменную.

А насчет переноса темы по-моему это спорный вопрос: с одной стороны Bash - оболочка в Linux, с другой - коммандный язык программирования. Я думаю для Bash нужно две темы - одна по программированию в Bash(Bash-scripting), вторая по использованию и настройке.

Это сообщение отредактировал(а) savigm - 29.3.2009, 01:59
PM MAIL ICQ   Вверх
Cr@$h
Дата 29.3.2009, 12:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Исследователь
***


Профиль
Группа: Участник Клуба
Сообщений: 1693
Регистрация: 3.4.2005
Где: Санкт-Петербург, Россия

Репутация: нет
Всего: 41



Модератор: Пожалуйста, один топик - один вопрос.
Правила форума: http://forum.vingrad.ru/index.php?act=boardrules
Модератор: bash - командный процессор. Тему по всем вопросам создавать нельзя. Поднимать вопрос о создании подфорума для оболочки POSIX нужно в разделах *nix
PM MAIL ICQ   Вверх
powerfox
Дата 29.3.2009, 12:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I wanna fork()
****


Профиль
Группа: Комодератор
Сообщений: 3990
Регистрация: 1.10.2005
Где: Санкт-Петербург

Репутация: 26
Всего: 97



Цитата(savigm @  29.3.2009,  02:36 Найти цитируемый пост)
powerfox, второй скрипт может передать первому значение и без функций - exit <код возврата>, но так как идеологически код возврата 0 - норм. звершение программы(скрипта), не 0 - код ошибки мне бы хотелось передавать значение из второго скрипта(вызванного из первого) через переменную.

Я об этом написал. Просто не всегда нужно передавать число.


--------------------
user posted image
PM WWW   Вверх
savigm
Дата 29.3.2009, 14:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 88
Регистрация: 15.12.2008
Где: г. Зеленоград

Репутация: нет
Всего: нет



Т.е. скрипт может возвращать не только число? Как? С помощью exit можно вернуть только числа [0..255]. Мне необходимо, чтобы второй скрипт возвращал 0 или не 0 информируя о нормальном завершении, либо о номере ошибки, собственно как это и должно быть, но нужно еще передать и строковую переменную. Здесь уже видимо без создания временного файла не обойтись.
PM MAIL ICQ   Вверх
xaran4o
Дата 29.3.2009, 19:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 29.3.2009

Репутация: нет
Всего: нет



Цитата

мне бы хотелось передавать значение из второго скрипта(вызванного из первого) через переменную.


Переменная определенная в "родительском" скрипте с префиксом export, видна в "дочернем". smile  smile 
PM MAIL   Вверх
powerfox
Дата 29.3.2009, 21:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I wanna fork()
****


Профиль
Группа: Комодератор
Сообщений: 3990
Регистрация: 1.10.2005
Где: Санкт-Петербург

Репутация: 26
Всего: 97



Цитата(savigm @  29.3.2009,  15:43 Найти цитируемый пост)
Т.е. скрипт может возвращать не только число? Как? С помощью exit можно вернуть только числа [0..255]. Мне необходимо, чтобы второй скрипт возвращал 0 или не 0 информируя о нормальном завершении, либо о номере ошибки, собственно как это и должно быть, но нужно еще передать и строковую переменную. Здесь уже видимо без создания временного файла не обойтись. 

Всё зависит от того, что у вас за скрипт2.

Цитата(xaran4o @  29.3.2009,  20:33 Найти цитируемый пост)
Переменная определенная в "родительском" скрипте с префиксом export, видна в "дочернем". smile  smile  

Видна не значит, что если её изменить в дочерней оболочке (именно в ней запустится скрипт), изменения затронут переменную в родительском. Механизма «обратного» экспорта не существует.

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


savigm, а чем не устраивает вывод второго скрипта?
Код

fox@linux-ltde:/> qwe=$(date)
fox@linux-ltde:/> echo $qwe
Вск Мар 29 22:32:30 MSD 2009


Если у скрипта есть дополнительный вывод, то можно использовать регулярные выражения (или sed/awk), чтобы получить значение из строки "MY_SUPER_SCRIPT_RESULT=qweqweqweqw".




--------------------
user posted image
PM WWW   Вверх
gcc
Дата 29.3.2009, 22:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Агент алкомафии
****


Профиль
Группа: Участник
Сообщений: 2691
Регистрация: 25.4.2008
Где: %&й

Репутация: 2
Всего: 17



Код

echo $QUERY_STRING;


если я правильно понял
PM WWW ICQ Skype GTalk Jabber   Вверх
savigm
Дата 29.3.2009, 22:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 88
Регистрация: 15.12.2008
Где: г. Зеленоград

Репутация: нет
Всего: нет



Цитата(powerfox @  29.3.2009,  21:40 Найти цитируемый пост)
savigm, а чем не устраивает вывод второго скрипта?
Выделить всёБез подсветки
1:
2:
3:
    
fox@linux-ltde:/> qwe=$(date)
fox@linux-ltde:/> echo $qwe
Вск Мар 29 22:32:30 MSD 2009


Если у скрипта есть дополнительный вывод, то можно использовать регулярные выражения (или sed/awk), чтобы получить значение из строки "MY_SUPER_SCRIPT_RESULT=qweqweqweqw".

Обьясню: в первом скрипте читаются статусные файлы, читаются директории и т.п., на основании этой информации идет часть выдачи, потом выполняется программа, на основании результата(результат пишется в файл) выполненной программы идет остальная выдача. По предложенному варианту эта выдача будет идти сразу, а не частями, а хотелось бы чтобы было как в первом скрипте: сначала первая часть выдачи, потом результат программы. Дублировать часть кода для первой части выдачи во втором скрипте неохота, тем более это будет двойная работа.
PM MAIL ICQ   Вверх
powerfox
Дата 30.3.2009, 01:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I wanna fork()
****


Профиль
Группа: Комодератор
Сообщений: 3990
Регистрация: 1.10.2005
Где: Санкт-Петербург

Репутация: 26
Всего: 97



Цитата(savigm @  29.3.2009,  23:10 Найти цитируемый пост)
Обьясню: в первом скрипте читаются статусные файлы, читаются директории и т.п., на основании этой информации идет часть выдачи, потом выполняется программа, на основании результата(результат пишется в файл) выполненной программы идет остальная выдача. По предложенному варианту эта выдача будет идти сразу, а не частями, а хотелось бы чтобы было как в первом скрипте: сначала первая часть выдачи, потом результат программы. Дублировать часть кода для первой части выдачи во втором скрипте неохота, тем более это будет двойная работа. 

Я не понял, что вы хотите. Во всяком случае это не соответствует тому, что вы спросили в начале темы.



--------------------
user posted image
PM WWW   Вверх
Vaulter
Дата 30.3.2009, 01:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1724
Регистрация: 30.12.2002
Где: бункер

Репутация: 3
Всего: 22



Код

# Инициализация
# Препарация
. status_files
for file in .; do
#....
done


## НИКОГДА ТАК НЕ ПИШИ :) 

echo -n " ==> Exit with $?: "

if ( ERRSTR=$(my_very_needed_bin 2>>outerr.log) ); then echo "failed"; else echo "OK"; 

echo $ERRSTR


Добавлено через 1 минуту и 4 секунды
my_very_needed_bin может выводить в обычный и поток ошибок... если нужно, и еще вовращать статус выхода!

Этого достаточно? smile

Добавлено через 1 минуту и 45 секунд
$? - это.... артефакт smile  smile 


--------------------
PM MAIL WWW ICQ   Вверх
xaran4o
Дата 30.3.2009, 09:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 29.3.2009

Репутация: нет
Всего: нет



Цитата

powerfox.    Есть команда '.', которая позволяет выполнить команды скрипты, за запуская дочернюю оболочку, но это не самый элегантый способ. Эта команда было специально создана для обновления .profile, а не для выполнения скриптов.


поясните новичку, чем плоха комманда "."    Чревата коллизиями, это понятно, если используешь "чужой" скрипт. А еще? Если я пишу "родительский" и "дочерний" скрипты сам??
PM MAIL   Вверх
powerfox
Дата 30.3.2009, 14:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I wanna fork()
****


Профиль
Группа: Комодератор
Сообщений: 3990
Регистрация: 1.10.2005
Где: Санкт-Петербург

Репутация: 26
Всего: 97



Цитата(xaran4o @  30.3.2009,  10:30 Найти цитируемый пост)
поясните новичку, чем плоха комманда "."    Чревата коллизиями, это понятно, если используешь "чужой" скрипт. А еще? Если я пишу "родительский" и "дочерний" скрипты сам?? 


Тем, что нужно следить за именами функций и переменных. А если потом захочется один из скриптов использовать отдельно, то можно попасть в просак. Эта команда, как Goto в С/C++: мощная штука, но нужно применять с умом.



--------------------
user posted image
PM WWW   Вверх
MAKCim
Дата 30.3.2009, 15:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 21
Всего: 207



Цитата(savigm @  29.3.2009,  14:43 Найти цитируемый пост)
Т.е. скрипт может возвращать не только число? Как?

Код

#!/bin/bash

# parent script `parent'

var=$(child 2>/dev/null)

echo $var

Код

#!/bin/bash

# child script `child'

echo "1234656789"



--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
savigm
Дата 30.3.2009, 15:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 88
Регистрация: 15.12.2008
Где: г. Зеленоград

Репутация: нет
Всего: нет



Вобщем скрипты немного поменялись, переменную из дочернего скрипта передаю по подстановке команд: $var=`script1.sh`

Поясню на упрощенном примере, что мне нужно:

Первый скрипт - script1.sh:
Код

if [ ! -x program.bin ]; then
    exit 1
fi
echo -n "Run <$file> ......... "
./program.bin file1 > ${file}.log
if grep -q "OK" ${file}.log; then
    echo "[OK]"
elif grep -q "ERROR"; then
    echo "[ERROR]"
else
    echo "[ABEND]"
fi

Единственный параметр script1.sh - имя файла file, program bin при удачном завершении выдает "[OK]", при неудачном завершении "[ERROR]". Если программа завершилась ненормально(например по [Ctrl]+[C]) - выдается "[ABEND]". Код возврата script1.sh - 0 нормальное завершение, не 0 - ненормальное завершение(например отсутсвие файла program.bin).

Второй скрипт - script2.sh:
Код

all_files=`cat status.txt`
for file in $all_files; do
    echo -n "Run <$file> ......... "
    result=`./script1.sh $file`
    echo $result
done

Статусный файл соодержит имена файлов file для первого скрипта script1.sh.

Остается одна проблема: как анализировать код возврата первого скрипта, в случае ненулевого сразу завершить script2.sh.
Если сразу после
Код

result=`./script1.sh $file`

анализировать $? это и будет код возврата скрипта script1.sh, или это будет код возврата присвоения переменной result?

Это сообщение отредактировал(а) savigm - 30.3.2009, 15:22
PM MAIL ICQ   Вверх
Vaulter
Дата 30.3.2009, 22:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1724
Регистрация: 30.12.2002
Где: бункер

Репутация: 3
Всего: 22



по первому script1.sh
зачем лишний файл лога? можно сразу
Код

if [ ! -x program.bin ]; then
    exit 1
fi

echo -n "Run <$file> ......... "
$ret=$(./program.bin $file 2> ${file}.err.log)

if [ "[OK]" = "$ret" ]; then
    echo "Ok";  //
    exit 0;
elif [ "[ERROR]" = "$ret]; then
    echo "Failed";
    exit 1;
else
    echo "Aborted"
    exit 2;
fi


Код

all_files=`cat status.txt`
for file in "$all_files"; do
    echo -n "Run <$file> ......... "
    out=`./script1.sh $file 2>&1`
    retval=$?
    echo "( $retval ) $out"

    if (( $? )); then echo "ERROR on $file"; fi

done




--------------------
PM MAIL WWW ICQ   Вверх
savigm
Дата 31.3.2009, 02:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 88
Регистрация: 15.12.2008
Где: г. Зеленоград

Репутация: нет
Всего: нет



Vaulter, В первом скрипте нужен лог  выдачи program.bin для отдельных целей. Я так понимаю в $? будет именно код возврата скрипта script1.sh (./script1.sh $file), а не код возврата операции присвоения (result=`./script1.sh $file`)?
PM MAIL ICQ   Вверх
Vaulter
Дата 31.3.2009, 02:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1724
Регистрация: 30.12.2002
Где: бункер

Репутация: 3
Всего: 22



$? код возврата последнего завершившегося процесса.
присвоение, насколько я знаю - это не процесс.


--------------------
PM MAIL WWW ICQ   Вверх
savigm
Дата 5.4.2009, 00:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 88
Регистрация: 15.12.2008
Где: г. Зеленоград

Репутация: нет
Всего: нет



powerfox
Vaulter, спасибо, тема по-моему вполне освещена, вывод следующий:
из дочернего скрипта, как правильно заметил powerfox, можно получить два результата - выдача и код возврата.
PM MAIL ICQ   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Linux/UNIX: Oбщие вопросы"
nickless
Imple
nerezus

В тему здесь вопросы общие - не привязанные к определенному ПО или дистрибутиву BSD/Linux/UNIX.
Например вопросы о выборе ОС для определенных задач (но если Вы просто хотите узнать "Какой дистрибутив лучше", то для этого есть Клуб юнуксоидов).
Общие вопросы по shell-программированию тоже лучше задавать здесь.


  • Вопросы мобильной разработки тут
  • Вы должны соблюдать правила форума.
  • Помните: какой вопрос, такой и ответ. Прежде чем задать вопрос прочитайте вот эту статью на форуме CIT.
  • Оскорблять запрещается.
  • Религиозные войны в Религиозных войнах.
  • Общение "просто так" в Клубе юнуксоидов. В отличие от многих других разделов, здесь разрешается сдержанно оффтопить и юморить в тему.

За интересные статьи, находки, решения, программы и просто реальную помощь будут ставиться + в репу).


В данный момент этот раздел модерируют nerezus, nickless, powerfox, pythonwin, Imple и ZeeLax. Если вы хотите помочь нам, пишите в ПМ и мы обсудим.


Спасибо. И use UNIX or die; С уважением, nerezus, nickless, powerfox, pythonwin, Imple, ZeeLax.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | *NIX системы: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1066 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.