Как передать VAR из дочернего сценария в цикл выполнения родительского сценария - PullRequest
1 голос
/ 26 марта 2019

Я думаю, как решить эту функцию на следующем примере:

#!/bin/bash

. script.sh &

while [ "$VAR" != "OK" ];
do
    echo -e "Waiting..."
    sleep 1
done

script.sh

#!/bin/bash
export VAR=OK

Поскольку цикл while выполняется в подоболочке родительской оболочки, он никогда не завершится, так как никогда не получит источник script.sh export VAR=OK.

Есть идеи, как передать значение VAR в цикл while?

ПРИМЕЧАНИЕ: мне нужно запустить script.sh в фоновом режиме.

Спасибо!

Ответы [ 5 ]

0 голосов
/ 27 марта 2019

Этого можно добиться с помощью процесса подстановки

#!/bin/bash

VAR=$(. script.sh &)

while [ "$VAR" != "OK" ];
do
    echo -e "Waiting..."
    sleep 1
done

script.sh

$VAR=OK
echo $VAR
0 голосов
/ 26 марта 2019

Системы Unix / Linux имеют отличную поддержку межпроцессного взаимодействия. В этом случае я думаю, что вы ищете сигнал. Например, вы можете сделать что-то вроде этого:

foo &
FOO_PID=$!
# do other stuff
kill $FOO_PID

если важно, чтобы цикл завершился до завершения процесса, вы можете перехватить этот сигнал и установить VAR=OK при получении этого сигнала

0 голосов
/ 26 марта 2019

ребенок

#!/bin/bash
sleep 2                   # wait 2 seconds
echo "OK"

родитель

#!/bin/bash
answer=$(mktemp)          # create a tempfile
./script.sh & >$answer    # start script in background, output in tempfile
wait $!                   # wait for script.sh finished
var=$(cat $answer)        # read anwser in variable 
echo $var                 # echo anwser
rm $answer                # cleanup - remove tempfile
0 голосов
/ 26 марта 2019

Это должно делать то, что вы хотите:

child:

sleep 1
echo blah >> $varfile

parent:

#make sure varfile exists and is empty..
echo > varfile

#run script in background
./script.sh &

# wait for some output:
VAR=$( ( tail -f varfile & )  | sed "/.*$/q")
echo >> varfile;

Просто, чтобы объяснить немного хитрости здесь:

tail -f используется для захвата вывода.Этот вызов не завершается, когда он попадает в конец файла, но вместо этого сидит и ждет, когда в файл будет записано больше (что вам и нужно ... сначала ...).Когда он получит полную строку, он выведет ее, а затем дождется следующей строки.Хитрость в том, что она не заканчивается в нормальных условиях.Вместо этого он будет продолжать работать до тех пор, пока кто-либо не сделает Ctrl-C или пока он не обнаружит сломанный канал.Это должно быть выдвинуто как фоновая задача, иначе команда в скрипте никогда не завершится.Его вывод передается в sed.sed, с другой стороны, завершится, когда он получит действительный конец ввода (из-за $ в шаблоне), и когда это произойдет, выполнение сценария продолжится.Но обратите внимание, что task все еще работает в этой точке и будет продолжать работать, пока не попытается что-то протолкнуть к сломанной трубе.Чтобы предотвратить его бесконечную работу, мы выводим что-то на него после того, как sed завершается, и в этот момент он понимает, что канал сломан, и завершается.

0 голосов
/ 26 марта 2019

parent.sh

#!/bin/bash

while :
do
   if [ -e /tmp/var_file ]; then
      VAR=$(cat /tmp/var_file)
      echo "VAR is $VAR"
      rm -f /tmp/var_file
   fi
   sleep 1
done

child.sh

#!/bin/bash

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