Bash рабочих мест в фоновом режиме - PullRequest
3 голосов
/ 25 июля 2011

Есть ли способ разрешить фоновое задание в bash для изменения переменных?Например:

[bash]# a=1
[bash]# a=2 &
[1] 14533
[bash]# echo $a
1

Я бы хотел, чтобы значение a было 2, а не 1

Ответы [ 4 ]

4 голосов
/ 25 июля 2011

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

1 голос
/ 19 октября 2011

Дочерний процесс не может влиять на среду его родителя, но если ваш фоновый процесс заканчивается после оценки, вы можете «передать» значение в качестве кода выхода.Родитель может поймать его с помощью команды wait.Вот пример фонового процесса, возвращающего переменную, увеличенную на единицу:

etuardu@subranu:~$ a=1
etuardu@subranu:~$ (exit $[ $a + 1 ]) &
[1] 7486
etuardu@subranu:~$ wait $!; a=$?
[1]+  Exit 2                  ( exit $[ $a + 1 ] )
etuardu@subranu:~$ echo $a
2
0 голосов
/ 25 июля 2011

Как хорошо объяснил Карл, это невозможно.

Пример:

#!/bin/bash

a=1
for i in 1 2 3 4 5 6 7 8 9 10
do
    let a=a+1 ;echo "Child value $a"
done &
sleep 2
echo "Parent value $a"

В выводе будет показан дочерний элемент со значением 1-10, а затем родительский элемент со старым значением 1.

0 голосов
/ 25 июля 2011
-> a=1
-> a=2; exit &
-> echo $a
2
...