小编bri*_*ice的帖子

如何阻止 bash 打印警报?

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)

linux unix script bash process

3
推荐指数
1
解决办法
2765
查看次数

Grep 无法输出到管道?

我在对 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)

[编辑]: …

linux unix bash shell command-line

3
推荐指数
1
解决办法
2570
查看次数

标签 统计

bash ×2

linux ×2

unix ×2

command-line ×1

process ×1

script ×1

shell ×1