我在Bash编写新脚本;我想要做的是运行一个永远运行的进程(即Gulp),并在打印到屏幕线时停止它。
在我的情况下,当我启动Gulp时,它打印数千行(大约需要20秒),然后它仍在等待;它打印的最后一行总是
[Browsersync] Serving files from: src
我尝试用这个脚本实现我的目标:
cd ~/mydir
gulp serve &
while read -r line; do
if [ "$line"=="[Browsersync] Serving files from: src" ]; then
echo 'pid of Gulp before killing it is : ' `pidof gulp`
# Get its PID
PID=$!
kill -INT $PID
echo 'pid of Gulp now is : ' `pidof gulp`
fi
done
但这并不能阻止吞咽过程。我做错了什么?
编辑:请注意,这只是整个脚本的一部分。
答案 0 :(得分:1)
您需要将后台运行程序的输出与read
的输入相关联。
最简单的方法是将其作为bash
coprocess
运行:
协同进程在子shell中异步执行,就好像命令已使用
&
控制操作符终止,在执行的shell和协同进程之间建立了双向管道
命令的标准输出(gulp serve
)将在COPROC[0]
(COPROC
数组的第一个元素)中的文件描述符中提供,COPROC_PID
中的PID将可用
例如:
#!/bin/bash
coproc gulp serve
while IFS= read -r line; do
if [ "$line" == "[Browsersync] Serving files from: src" ]; then
kill -INT "$COPROC_PID"
fi
done <&"${COPROC[0]}"