Простой вопрос о фоновом процессе в Bash - PullRequest
2 голосов
/ 30 июня 2011

Я использую BASH и вызываю несколько функций, которые обновляют пару переменных. Эти функции выполняются слишком долго, поэтому я подумал о запуске всех функций в фоновом режиме, чтобы они могли работать одновременно. Это основной пример того, что я спрашиваю.

#/bin/bash

func1()
{
    var1="one"

}

func2()
{
    var2="two"

}

func3()
{
    var3="three"

}

echo "Right now this is what i am doing"
func1 &
func2 &
func3 &
wait
echo "The variables are $var1 $var2 $var3"
echo "But the variables are empty. 
echo "Hence, I am assuming that they are not accessible outside of the function"

Я чувствую, что упускаю что-то очень глупое. Конечно, если я не запускаю функции в фоновом режиме, они показывают правильные переменные. Заранее спасибо.

Ответы [ 3 ]

7 голосов
/ 30 июня 2011

Если вам действительно нужно это сделать, то хаком будет заставить ваши функции распечатать bash-код, который затем можно будет как-то захватить и оценить.

Я уверен, что самым простым способом было бы просто заставить ваши функции выводить код во временный файл, а затем исходить из этого файла в конце. Таким образом, вы бы изменили функции так:

func1(){
    echo "var1=one"
}

тогда в конце сделайте что-то вроде:

TEMPFILE=`mktemp`
func1 >> $TEMPFILE &
func2 >> $TEMPFILE &
func3 >> $TEMPFILE &
wait
source $TEMPFILE
rm $TEMPFILE
echo "$var1 $var2 $var3"

Если сами функции выводят на печать, вам, возможно, придется сделать что-то вроде экспорта переменной, содержащей имя временного файла, а затем перенаправить в функцию, а именно:

export TEMPFILE=`mktemp`
func1(){
    echo "var1=one" >> $TEMPFILE
}

не забудьте удалить временные файлы ...

ПРИМЕЧАНИЕ: вероятно, есть гораздо лучший способ.

7 голосов
/ 30 июня 2011

Если вы запускаете что-то в фоновом режиме, оно запускается как отдельный дочерний процесс со своей собственной средой.

Это не может повлиять на среду текущего процесса (родительского процессаэти субоболочки).

Таким образом, переменные не так доступны вне функции , как они не доступны вне процесса.Функция не имеет значения, поскольку, если вы запускаете их на переднем плане (без &), переменные устанавливаются просто отлично.

0 голосов
/ 30 июня 2011

Хм, попробуйте это:

Прежде всего, вместо var3="value", используйте echo -n value > .var3 и запишите значение в файл. Точка перед именем сделает его «скрытым», и -n перестает выводить новую строку после него.

затем в конце вместо echo "values are $var1 $var2 $var3" do echo "values are $(cat .var1) $(cat .var2) $(cat .var3)". Команда cat выводит содержимое файла на стандартный вывод.

= -)

P.S. Вы также можете использовать «именованные каналы». используйте mkfifo для создания именованного канала. Однако, когда вы откликаетесь на именованный канал, вы должны запустить его как задание, иначе ваш скрипт будет зависать, пока вы не прочитаете содержимое [с помощью cat]. Итак: echo val > .named_pipe&

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...