Это должно делать то, что вы хотите:
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 завершается, и в этот момент он понимает, что канал сломан, и завершается.