如何既在控制台上显示命令行的输出又将输出保存到文本文件中?


25

我怎么可以运行sudo apt-get install通过BOTH看到安装的过程中(长在我的情况)其输出保存到一个文本文件?


仅是apt-get对的吗?
Braiam 2014年

@Braiam我认为我接受的解决方案可以应用于所有其他命令,您认为呢?

Answers:


17

使用script命令。它将复制屏幕上显示的所有内容

script -c "sudo apt-get install things" script-file.script

script将命令输出发送到文件,但不在屏幕上显示。
亚伦2014年

2
@ BryceAtNetwork23。您是否尝试过该命令?脚本确实将输出发送到屏幕。
2014年

1
是的 我运行script -c "history" ~/hist.txt并看到指示Script started和的输出Script done,但没有在屏幕上看到实际命令的输出。
亚伦2014年

10
@ BryceAtNetwork23 history是一个shell buildint,而不是一个外部命令。发生的情况是:1)脚本启动,2)脚本搜索history命令,未找到它,因此猜测它应该通过外壳程序运行。3)脚本history 通过外壳运行命令4)新的外壳启动并执行历史内部命令。由于这是一个新的非交互式外壳,因此历史无话可说。
2014年

1
script也可以交互式运行。只需script在命令提示符下键入。您将获得一个新的shell,并且您键入的任何命令都将保存其输出。键入exit以结束外壳程序并保存文件。默认情况下,将调用输出,并且该输出typescript将包含屏幕上显示的所有内容(无论是键入内容还是命令的输出)。该history命令在新的shell中也应该仍然可用。
Brian Minton 2014年

52

您可以使用tee命令来完成此操作。

sudo apt-get install someapp 2>&1 | tee ~/someappInstall.txt

在这里查看更多信息,或执行man tee

注意:正如其他人提到的那样,2>&1有必要将STDERR重定向到STDOUT以捕获任何错误。请参阅此StackOverflow问题以获取有关2>&1实际功能的良好解释。


我会在“ |”之前添加“ 2>&1”
Olivier Dulac 2014年

2
这比script因为不必引用该命令而更加实用。因此,bash完成之类的优势更容易实现。
2014年

2
@Dan:脚本不需要-c "something ...":if,然后将您放到一个shell中,并在退出该shell时完成。允许多个命令,等等。此外,它还保留更多的“格式化”信息,允许重播更多内容(例如:清除屏幕等)(但这也会使输出混乱... ymmv)
Olivier Dulac

2
@Dan +使用函数,别名,内置插件甚至命令组和子外壳。这应该是IMO接受的答案。
Darkhogg 2014年

1
您可以使用它|&代替2>&1 |bash
jfs 2014年

15

tee 将按要求完成工作。

要将输出捕获到文件中,请使用:

sudo apt-get install your_software | tee log_file.txt

这将仅捕获输出,而不捕获任何错误消息。如果您还想记录错误消息,请将命令修改为:

sudo apt-get install your_software 2>&1  | tee log_file.txt

或者,由于bash 支持|&操作员,因此sudo apt-get install your_software |& tee log_file.txt会将stdoutstderr都管道传输到tee。(对JF塞巴斯蒂安JF Sebastian在其他地方提出过建议表示
敬意

9

apt-get(通常是APT)的优点之一是,它们将几乎所有内容存储在日志文件中,甚至包括您在槽中运行的任何命令的终端输出/var/log/apt。例如,这是my中的最后一个条目/var/log/apt/term.log

Log started: 2014-06-20  16:46:08
(Reading database ... 252472 files and directories currently installed.)
Removing xdotool (1:3.20130111.1-3.1) ...
Processing triggers for man-db (2.6.7.1-1) ...
Log ended: 2014-06-20  16:46:33

现在,与实际输出进行比较:

➜  ~  sudo apt-get remove xdotool 
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following package was automatically installed and is no longer required:
  libxdo3
Use 'apt-get autoremove' to remove it.
The following packages will be REMOVED:
  xdotool
0 upgraded, 0 newly installed, 1 to remove and 2 not upgraded.
After this operation, 135 kB disk space will be freed.
Do you want to continue? [Y/n] y
(Reading database ... 252472 files and directories currently installed.)
Removing xdotool (1:3.20130111.1-3.1) ...
Processing triggers for man-db (2.6.7.1-1) ...

它为我节省了在大多数情况下不相关的几行,并且自动执行。因此,您不需要任何额外的命令即可执行所需的操作,而apt-get会为您完成。


1

尝试使用tee命令。您可以在此处找到一些示例。

简单用法:

  <command> | tee file

例:

  sudo apt-get install whatYouWant | tee outputFile
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.