kill -9 $PID &>/dev/null在脚本中杀死进程时,在下一个命令终止后仍会向终端打印一条消息。你如何阻止这种行为?
例如
while true; do
/usr/bin/dostuff -a -b -c
PID=$(pidof -o %PPID /usr/bin/dostuff)
sleep 1;
kill -KILL $PID &>/dev/null
echo "hello"
done
Run Code Online (Sandbox Code Playgroud)
会打印类似的东西
hello
./my-cript.sh: line 12: 7134 Killed
/usr/bin/dostuff -a -b -c
Run Code Online (Sandbox Code Playgroud)
当我只想打印“你好”时
编辑: 干净的解决方案是在子shell中运行程序,或者否认它。
#SOLUTION
while true; do
/usr/bin/dostuff -a -b -c &
disown
PID=$!
sleep 1;
kill -KILL $PID &>/dev/null
echo "hello"
done
Run Code Online (Sandbox Code Playgroud) 我在对 make 输出进行 grep 过滤时遇到问题。特别是,
make target 2>&1 | grep -E --color=never "^make.*"
Run Code Online (Sandbox Code Playgroud)
按预期工作,但以下内容不会向控制台打印输出:
make target 2>&1 | grep -E --color=never "^make.*" | cat
Run Code Online (Sandbox Code Playgroud)
我错过了一些明显的东西吗?为什么第一个命令输出而不是第二个?是否与某种 IO 缓冲有关?还是我只是愚蠢?
[编辑]: cat只是我要使用的实际命令的最小测试用例占位符。
[编辑]:这似乎不是 grep 的问题,因为用ack替换它会导致相同的行为。
[编辑]: cat 是占位符的脚本:
#!/bin/bash
cat - \
| grep -E --color=never "^.*warning:.*|^.*error:.*|^make.*[Ee]rror.*|^make.*" \
| hilite.sh -r "^.*warning:.*" -f yellow -B \
| hilite.sh -r "^.*error:.*" -f red -B \
| hilite.sh -r "^make.*[Ee]rror.*" -f red -B \
| hilite.sh -r "^make.*" -f magenta
Run Code Online (Sandbox Code Playgroud)
[编辑]: …