使用sudo配合tee时终端输出出现偏移的问题求助
嘿,我遇到了一个挺棘手的终端输出问题,想请教各位大神帮忙解决:
之前我不用sudo的时候,用下面的命令可以同时在终端显示程序输出并记录到日志文件,一切正常:
./my_app | tee path/to/log_file
现在因为程序需要root权限,我改成了:
sudo ./my_app | tee path/to/log_file
结果问题来了——当我在命令行要求用户输入(比如按回车)之后,终端的输出就出现了奇怪的偏移重复,比如每一行开头都会重复:
start of line 1 this is a test
start of line 1 this is a test
start of line 1 this is a test
start of line 1 this is a test
这种情况在不用sudo或者不用tee的时候从来没出现过,有没有办法同时使用sudo和tee,又能避免这个输出偏移的问题呢?
可能的解决办法
这个问题的根源是sudo只作用于./my_app,而tee是在普通用户环境下运行的,两者对终端的输入输出处理(比如终端属性、IO同步)不一致,在交互式操作后就会出现输出混乱。这里有几个靠谱的解决方法:
方法一:让整个管道在sudo环境下运行
用sh -c把整个管道命令包裹起来,让my_app和tee都以root权限运行,这样终端处理逻辑就统一了:sudo sh -c './my_app | tee path/to/log_file'方法二:使用
script命令捕获终端会话script是专门用来记录终端交互会话的工具,能很好处理交互式程序的输出同步,避免偏移:sudo script -q -c "./my_app" path/to/log_file其中
-q是静默模式,不会显示script的启动提示信息,输出会同时显示在终端并保存到日志文件。方法三:重定向输出+实时查看(备选)
如果前两种方法不适用,也可以先把程序输出重定向到日志,再用tail -f实时查看,但这种方式在交互式输入时体验稍差:sudo ./my_app > path/to/log_file 2>&1 & sudo tail -f path/to/log_file
备注:内容来源于stack exchange,提问作者intrigued_66

