使用 grep 搜索 stdout,而不替换 stdout

使用 grep 搜索 stdout,而不替换 stdout

目前,我将其放在包装脚本中:

2>&1 ./update.sh | ts | tee -a ./update.log

update.sh 中:

if apt full-upgrade -y | grep linux-headers
then
    echo
    echo Need to Fix the Capture Driver!
fi

(有一些额外的逻辑可以自动修复驱动程序,但我想你明白了)

它有效,只是我没有apt full-upgrade在终端或日志文件中获得完整的输出。我只得到grep匹配的内容。

我可能可以在、 然后和临时文件之前将tee其完整输出apt full-upgrade到临时文件,但是有没有比这更好的方法来获取完整的终端和日志并保留逻辑?ifgreprm

答案1

您不能/dev/stdout在此处使用,因为它将指向管道。一种方法可能是获取脚本原始标准输出的副本,并打印tee到其中(我没有测试这一点):

exec 9>&1    # make fd 9 a copy of the current stdout
apt full-upgrade -y | tee /dev/fd/9 | grep linux-headers
exec 9>&-    # close fd 9

如果您希望完整输出始终发送到终端,您可以使用/dev/tty

apt full-upgrade -y | tee /dev/tty | grep linux-headers

但这将使输出转到终端,无论整个脚本应用什么重定向。


在某些情况下,除了 stdout 之外,还可以使用进程替换将输出重定向到命令:

apt full-upgrade -y | tee >(grep linux-headers)

但这在这里并不起作用,因为您需要 的退出状态,grep并且进程替换并不容易获得它。

相关内容