Модераторы: 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   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "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.1432 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


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

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