如何为BASH中apt update&&apt upgrade的所有输出行添加前缀?
解决apt输出无法添加前缀的问题
那些以Hit:、Reading、Building开头的行没被捕获,是因为apt检测到当前环境是终端时,会把这类状态信息直接输出到控制终端(/dev/tty),绕过了常规的stdout/stderr重定向,所以你的sed过滤抓不到这些内容。
下面是两种可行的解决方法:
方法一:用script命令捕获所有终端输出
script命令可以记录所有发送到终端的内容,包括绕过stdout/stderr的输出,适合统一处理所有日志:
script -qec 'sudo apt update && sudo apt -y upgrade' /dev/null | sed 's/^/[prefix]/'
-q:静默模式,不显示script本身的启动/结束信息-e:执行指定的命令序列/dev/null:不保存日志到文件,直接通过管道传给sed处理
如果需要区分stdout和stderr,可以在script内部做重定向:
script -qec '{ sudo apt update && sudo apt -y upgrade; } > >(sed "s/^/[prefix1]/") 2> >(sed "s/^/[prefix2]/" >&2)' /dev/null
方法二:强制apt将所有输出转到stdout/stderr
通过设置DEBIAN_FRONTEND=noninteractive环境变量,让apt禁用交互式终端输出,把所有内容都发送到标准流:
{ sudo DEBIAN_FRONTEND=noninteractive apt update && sudo DEBIAN_FRONTEND=noninteractive apt -y upgrade; } > >(sed "s/^/[prefix1]/") 2> >(sed "s/^/[prefix2]/" >&2)
这个方法会保留stdout和stderr的分离,同时让之前逃掉的状态信息被sed捕获处理。
内容的提问来源于stack exchange,提问作者level42
相关产品推荐
相关产品推荐

