В сущности, вы ничего не можете сделать, чтобы прочитать переменную непосредственно в родительской оболочке.
Первый цикл запускается в под-оболочке из-за &
; память под-оболочки полностью независима от памяти основной оболочки, и нет никакого способа (если не делать страшных вещей, таких как запуск отладчика на под-оболочке), чтобы получить доступ к памяти ребенка из родительской оболочки.
Если вы можете изменить процесс под-оболочки, чтобы записывать значение его переменной каждую секунду, то родительский объект сможет это обнаружить. В качестве альтернативы, если вложенная оболочка записывает переменную в файл с известным именем каждый раз, когда она меняет переменную, то вы можете читать файл так часто, как хотите в родительском:
#!/bin/bash
tmp=$(mktemp)
trap "rm -f $tmp; exit 1" 0 1 2 3 13 15
myvar=AAA
echo $myvar > $tmp
while true;
do
sleep 3
myvar=BBB
echo $myvar > $tmp
sleep 3
myvar=CCC
echo $myvar > $tmp
done &
while cat $tmp
do
sleep 1
done
rm -f $tmp
trap 0
Trappery обеспечивает удаление временного файла в большинстве случаев (сигналы HUP, INT, QUIT, PIPE и TERM).