如何将终端输出保存到文件?

led*_*epp 1120 command-line

如何将命令的输出保存到文件?

有没有不使用任何软件的方法?我想知道怎么做。

Set*_*eth 1314

是的,这是可能的,只需将输出(AKA stdout)重定向到一个文件:

SomeCommand > SomeFile.txt  
Run Code Online (Sandbox Code Playgroud)

或者,如果您想附加数据:

SomeCommand >> SomeFile.txt
Run Code Online (Sandbox Code Playgroud)

如果你也想stderr使用这个:

SomeCommand &> SomeFile.txt  
Run Code Online (Sandbox Code Playgroud)

或者这个要附加:

SomeCommand &>> SomeFile.txt  
Run Code Online (Sandbox Code Playgroud)

如果您想在控制台文件中同时显示stderr和输出,请使用以下命令:

SomeCommand 2>&1 | tee SomeFile.txt
Run Code Online (Sandbox Code Playgroud)

(如果您只想要输出,请删除2以上内容)

  • 请注意,`someCommand 2> someFile.txt` 和 `someCommand 2>> someFile.txt` 也将 `sttter` 重定向到 someFile.txt (28认同)

Byt*_*der 1308

要将命令的输出写入文件,基本上有 10 种常用的方法。

概述:

请注意,n.e.语法列中的 表示“不存在”。
有一种方法,但是太复杂了,无法放入列中。您可以在“列表”部分找到有关它的有用链接。

          || visible in terminal ||   visible in file   || existing
  Syntax  ||  StdOut  |  StdErr  ||  StdOut  |  StdErr  ||   file   
==========++==========+==========++==========+==========++===========
    >     ||    no    |   yes    ||   yes    |    no    || overwrite
    >>    ||    no    |   yes    ||   yes    |    no    ||  append
          ||          |          ||          |          ||
   2>     ||   yes    |    no    ||    no    |   yes    || overwrite
   2>>    ||   yes    |    no    ||    no    |   yes    ||  append
          ||          |          ||          |          ||
   &>     ||    no    |    no    ||   yes    |   yes    || overwrite
   &>>    ||    no    |    no    ||   yes    |   yes    ||  append
          ||          |          ||          |          ||
 | tee    ||   yes    |   yes    ||   yes    |    no    || overwrite
 | tee -a ||   yes    |   yes    ||   yes    |    no    ||  append
          ||          |          ||          |          ||
 n.e. (*) ||   yes    |   yes    ||    no    |   yes    || overwrite
 n.e. (*) ||   yes    |   yes    ||    no    |   yes    ||  append
          ||          |          ||          |          ||
|& tee    ||   yes    |   yes    ||   yes    |   yes    || overwrite
|& tee -a ||   yes    |   yes    ||   yes    |   yes    ||  append
Run Code Online (Sandbox Code Playgroud)

列表:

  • command > output.txt

    标准输出流将仅重定向到文件,在终端中将不可见。如果文件已经存在,它会被覆盖。

  • command >> output.txt

    标准输出流将仅重定向到文件,在终端中将不可见。如果文件已经存在,新数据将附加到文件末尾。

  • command 2> output.txt

    标准错误流将仅重定向到文件,在终端中将不可见。如果文件已经存在,它会被覆盖。

  • command 2>> output.txt

    标准错误流将仅重定向到文件,在终端中将不可见。如果文件已经存在,新数据将附加到文件末尾。

  • command &> output.txt

    标准输出和标准错误流都将仅重定向到文件,终端中将看不到任何内容。如果文件已经存在,它会被覆盖。

  • command &>> output.txt

    标准输出和标准错误流都将仅重定向到文件,终端中将看不到任何内容。如果文件已经存在,新数据将附加到文件末尾。

  • command | tee output.txt

    标准输出流将被复制到文件中,它仍将在终端中可见。如果文件已经存在,它会被覆盖。

  • command | tee -a output.txt

    标准输出流将被复制到文件中,它仍将在终端中可见。如果文件已经存在,新数据将附加到文件末尾。

  • (*)

    Bash 没有速记语法,只允许将 StdErr 传递给第二个命令,这里需要将其与tee再次组合以完成表。如果您真的需要这样的东西,请查看“如何通过管道 stderr,而不是 stdout?” 在 Stack Overflow 上了解如何做到这一点,例如通过交换流或使用进程替换。

  • command |& tee output.txt

    标准输出和标准错误流都将被复制到文件中,同时在终端中仍然可见。如果文件已经存在,它会被覆盖。

  • command |& tee -a output.txt

    标准输出和标准错误流都将被复制到文件中,同时在终端中仍然可见。如果文件已经存在,新数据将附加到文件末尾。

  • 谢谢你的桌子,它很棒!这应该是最佳答案 (92认同)
  • 请注意,'|&' 在 macOS 上对我不起作用。这是因为它有一个旧版本的 bash(我认为)。不太优雅的 '2>&1 |' 虽然工作正常 (23认同)
  • @karthick87 这与将输出重定向到文件的问题没有真正的关系,因为它只是将一个流重定向到另一个流。`2>&1` 将 STDERR 重定向到 STDOUT,`1>&2` 将 STDOUT 重定向到 STDERR,`3>&1` 将流 3 重定向到 STDERR。 (3认同)
  • @ByteCommander 当我在 c9.io 服务器的 Python 脚本中使用 `|& tee` 时,我收到错误:`sh: 1: Syntax error: "&" unexpected`。似乎正在使用不同的外壳。`echo $SHELL` 显示 `/bin/bash`,`$SHELL --version` 显示版本 4.3.11(1)-release。我在我的 python 脚本中尝试了 `#!/bin/bash`,但我仍然得到 `sh: 1: Syntax error`。我得到了我需要的东西,所以我放弃了在我的服务器上对 `sh` 和 `bash` 之间的奇怪之处进行排序。谢谢。 (2认同)

Aar*_*ron 124

您还可以使用tee将输出发送到文件:

command | tee ~/outputfile.txt
Run Code Online (Sandbox Code Playgroud)

稍作修改也将捕获 stderr:

command 2>&1 | tee ~/outputfile.txt
Run Code Online (Sandbox Code Playgroud)

或稍短且不那么复杂:

command |& tee ~/outputfile.txt
Run Code Online (Sandbox Code Playgroud)

tee如果您希望能够在实时查看命令输出的同时捕获命令输出,则非常有用。

  • @Mahesha999 2 是 STDERR 的文件描述符,1 是 STDOUT。这样 2>&1 将 STDERR 发送到 STDOUT。这个SO问题很好地解释了它:http://stackoverflow.com/questions/818255/in-the-shell-what-does-21-mean (2认同)

cha*_*aos 20

您可以将命令输出重定向到文件:

your_command >/path/to/file
Run Code Online (Sandbox Code Playgroud)

要将命令输出附加到文件而不是覆盖它,请使用:

your_command >>/path/to/file
Run Code Online (Sandbox Code Playgroud)

  • 最大文件大小仅通过文件系统进行限制 (3认同)
  • OP 从未要求保存 stderr (3认同)

小智 19

需要考虑的增强功能 -

各种脚本会将颜色代码注入到输出中,您可能不希望这些代码弄乱您的日志文件。

要解决此问题,您可以使用程序sed 去除这些代码。例子:

command 2>&1 | sed -r 's/'$(echo -e "\033")'\[[0-9]{1,2}(;([0-9]{1,2})?)?[mK]//g' | tee ~/outputfile.txt
Run Code Online (Sandbox Code Playgroud)

  • 如何以保留颜色的方式保存输出?我想在 libreoffice 中导入命令的结果并保留颜色。 (2认同)

tri*_*eee 10

对于cron工作等,您希望避免 Bash 扩展。等效的 POSIXsh重定向运算符是

Bash          POSIX
------------  --------------
foo &> bar    foo >bar 2>&1
foo &>> bar   foo >>bar 2>&1
foo |& bar    foo 2>&1 | bar
Run Code Online (Sandbox Code Playgroud)

您会注意到 POSIX 工具在某种意义上更简单、更直接。该&>语法是从借来csh应该已经说服你,这是一个坏主意。


Fra*_*urt 10

some_command | tee command.log并且some_command > command.log存在他们没有将命令输出command.log实时保存到文件的问题。

为避免该问题并实时保存命令输出,您可以附加包unbuffer随附的expect


例子:

sudo apt-get install expect
unbuffer some_command | tee command.log
unbuffer some_command > command.log
Run Code Online (Sandbox Code Playgroud)

假设log.py包含:

import time
print('testing')
time.sleep(100) # sleeping for 100 seconds
Run Code Online (Sandbox Code Playgroud)

你可以运行unbuffer python log.py | tee command.logunbuffer python log.py > command.log

更多信息:如何将命令输出实时保存到文件?


Win*_*nix 10

这里有两个不同的问题。第一个在标题中:

如何将终端输出保存到文件?

第二个问题是在正文中:

如何将命令的输出保存到文件?

此处发布的所有答案都解决了第二个问题,但没有解决第一个问题,该问题在Unix 和 Linux 中有很好的答案:

这个答案使用了一个鲜为人知的命令script,该命令将所有 shell 的输出保存到一个文本文件中,直到您键入exit. 命令输出仍会出现在屏幕上,但也会出现在文本文件中

这个过程很简单。用:

$ script ~/outputfile.txt
Script started, file is /home/rick/outputfile.txt
$ command1
$ command2
$ command3
$ exit
exit
Script done, file is /home/rick/outputfile.txt
Run Code Online (Sandbox Code Playgroud)

然后查看您记录的命令 1、2 和 3 的输出:

cat ~/outputfile.txt
Run Code Online (Sandbox Code Playgroud)

这类似于之前的回答

command |& tee ~/outputfile.txt
Run Code Online (Sandbox Code Playgroud)
  • 但是您不必|& tee ~/outputfile.txt在每个commnd.
  • script命令~/.bashrc在启动时增加了重新加载的好处(或缺点)。
  • script命令显示命令提示符 ( $PS1),后跟您输入的命令。
  • script命令以全彩色记录所有详细信息。

  • +1 :-) 我在以下上下文中使用“脚本”:[当缓慢的命令行进程需要我的注意时唤醒我?](https://askubuntu.com/questions/1106774/wake-me-up-when -a-slow-command-line-process-wants-my-attention/1106780#1106780) (2认同)
  • @sudodus +1 你的链接答案。我从来没有梦想过在这样的应用程序中使用“script”:) (2认同)
  • 当您输入交互式响应 y/n 等时,脚本是您需要的解决方案 (2认同)