假设我想查看命令的输出,例如apt-get
.但是,如果我运行重定向输出的命令,例如
apt-get install some-application -y > apt_out.txt
或者
apt-get install some-application -y | tee apt_out.txt
那么我将失去与程序输入交互的能力。然而我的解决方法是使用screen -L
会话,但是会有更干净的东西吗?
答案1
让我们从功能集和行为的角度来看待这个问题,而不是一些未指定的概念清洁度。
A不太通用机制比screen -L
,但是尽管如此出于您的目的,该命令不执行什么操作screen
(tee
即允许轻松交互使用,并且当程序发现标准输出不是终端时不使程序陷入非交互或缓冲输出模式)script
。
脚本-c“apt-get安装某些应用程序”apt_out.txt
一个不同的机制script
是ptybandage
是适合在命令管道中使用,以及才不是要求它自己的外部标准 I/O 实际上是一个终端。 (事实上,它的主要用例是使非交互式标准 I/O 对于子程序来说看起来像交互式标准 I/O。)这是一种说服程序在其交互式/行缓冲模式下运行,同时仍然使用直通管道的tee
方法。
ptybandage apt-get install some-application 2>&1 | ptybandage apt-get install some-application 2>&1 | ptybandage apt-get install some-application 2>&1 |三通 apt_out.txt
进一步阅读
- 如何在文件中捕获 stdout/stderr 但仍然在控制台中看到它?
- 如何欺骗命令使其认为其输出将发送到终端
- 从脚本输出中删除控制字符(包括控制台代码/颜色)
- 为什么在脚本(1)的输出中换行符是CR + LF(dos风格)?
- 从日志文件中删除 BS 和 ESC
- 乔纳森·德博因·波拉德 (2016)。Daniel J. Bernstein 的 ptyget 工具集。软件。
- 乔纳森·德博因·波拉德 (2016)。 Daniel J. Bernstein 的软件合一。软件。
答案2
screen -L
对我来说听起来是一个很好的解决方案。另一种选择是script
(这也会记录控制字符和错误输入,有些人觉得这令人困惑)。
许多程序都会测试它们的输入和输出是否连接到终端,并且会根据此失败或改变它们的行为。请参阅ls
vs.ls | cat
的一个小例子。