我正在编写一个脚本,其中我试图在同一进程中使用两个并发计时器。在下面的示例中,我尝试每 60 秒更新一次 IP 地址,同时每 5 秒输出一次 IP:
while true; do
ip=$(curl -4 -sf ifconfig.co)
sleep 60
done &
while true; do
echo $ip
sleep 5
done
这里的问题是第一个while
循环创建了一个子进程,因此不共享ip
地址变量。但如果我删除&
,脚本将永远不会进入第二个循环。
我可以将两个循环集成到一个循环中,但我想知道是否有更好的方法让这两个循环在同一进程中同时运行
答案1
不;bash
不支持这种方式的并发或多线程。子 shell 之间也不相互通信变量。
可以使用 FIFO 或临时文件将信息从一个子 shell 传递到另一个子 shell。
举个例子(只是为了让你继续):
mkfifo hoppa
while true; do
curl -4 -sf ifconfig.co >> hoppa
sleep 60
done &
while : ; do
read -t1 d <> hoppa
if [ "$d" != "" ] ; then
echo '+'
ipread=$d
else
echo -n '.'
fi
echo $ipread
sleep 5
done &