我正在考虑如何在以下示例中解决此功能:
#!/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
。
谢谢!
答案 0 :(得分:0)
孩子
#!/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
答案 1 :(得分:0)
这应该做您想要的:
孩子:
sleep 1
echo blah >> $varfile
父母:
#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终止后向它输出一些东西,这时它意识到管道已断开并终止。
答案 2 :(得分:0)
Unix / Linux系统对进程间通信提供了极大的支持。在这种情况下,我认为您正在寻找信号。例如,您可以执行以下操作:
{
"op": "add",
"path": "/fields/System.AssignedTo",
"value": "McClure, Brandon"
}
如果在过程退出之前完成循环很重要,则可以trap发出该信号,并在收到该信号时设置foo &
FOO_PID=$!
# do other stuff
kill $FOO_PID
答案 3 :(得分:0)
您可以使用Substitution流程来实现
#!/bin/bash
VAR=$(. script.sh &)
while [ "$VAR" != "OK" ];
do
echo -e "Waiting..."
sleep 1
done
script.sh
$VAR=OK
echo $VAR
答案 4 :(得分:-1)
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