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


687

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

有没有不用任何软件的方法吗?我想知道如何。

Answers:


735

是的,可以,只需将输出重定向到文件:

SomeCommand > SomeFile.txt  

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

SomeCommand >> SomeFile.txt

如果您也想stderr使用此功能:

SomeCommand &> SomeFile.txt  

或追加:

SomeCommand &>> SomeFile.txt  

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

SomeCommand 2>&1 | tee SomeFile.txt

(如果只需要输出,则删除2上面的内容)


15
请注意,someCommand 2> someFile.txt并且someCommand 2>> someFile.txt还会重定向stterr到someFile.txt
Slothworks

我正在尝试使用gcc命令执行此操作,但是它不起作用。它与其他命令一起使用,但不适用于此命令。它只是创建输出文件,其中没有任何内容。
Nikos'Sep

@ Nik-Lz通常是因为该命令正在stderr上发送其所有输出。如果gcc生成错误消息,则这似乎是可能的。有关如何捕获stderr而不是stdout的信息,请参见Slothworks注释。
乔纳森·哈特利

1
注意:要将make命令输出输出到文件中,它需要使用以下语法:(make > someFile.txt 2>&1来源:linuxquestions.org/questions/linux-newbie-8/…
Gabriel Staples

我有一个问题,当文件达到大约8MB时,它将停止写入。这是已知限制吗?
relG

863

要将命令的输出写入文件,基本上有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

清单:

  • 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

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


66
谢谢你的餐桌,很棒!这应该是最好的答案
DevShark '16

3
@ karthick87这实际上与将输出重定向到文件的问题无关,因为它只是将一个流重定向到另一个。2>&1将STDERR重定向到STDOUT,1>&2将STDOUT重定向到STDERR,3>&1并将流3重定向到STDERR。
字节指挥官

18
请注意,'|&'在macOS上不适合我。这是因为它具有较旧的bash版本(我认为)。不太优雅的'2>&1 |' 尽管工作正常
Danny Parker

2
@ByteCommander我收到错误:sh: 1: Syntax error: "&" unexpected当我|& tee从c9.io服务器中的Python脚本使用时。似乎正在使用其他外壳。echo $SHELL显示/bin/bash$SHELL --version显示版本4.3.11(1)-发行版。我#!/bin/bash在python脚本中尝试过,但还是得到了sh: 1: Syntax error。我得到了我所需要的,所以我放弃了对服务器之间shbash服务器上的异常进行排序。谢谢。
samkhan13

1
@ samkhan13看起来像您正在运行sh而不是在运行bash(或可能bash处于sh模式下...)。您可以检查当前外壳程序进程使用的是什么ps -p $$ -o cmd=,因为echo $SHELL它不可靠,并且会向您显示您的登录外壳程序,而无需考虑您是否已启动其他子外壳程序。
字节指挥官

108

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

command | tee ~/outputfile.txt

稍作修改也将捕获stderr:

command 2>&1 | tee ~/outputfile.txt

或稍短且不太复杂:

command |& tee ~/outputfile.txt

tee如果您希望既能捕获命令输出又能实时查看它,则该功能很有用


它表示&是意外的,并且不会在命令运行的同时写入日志。我在bash文件中使用它,这有什么区别吗?
tim687 '16

@ tim687我已删除该编辑。抱歉,这不是我原来的答案的一部分。
亚伦

@亚伦谢谢!tee会实时添加文件,对吗?我有一个用来备份PC的备份脚本,但是日志记录不是实时的。备份完成后,我的电脑进入睡眠状态,并且日志文件为空。我应该使用其他命令来记录命令吗?
tim687 '16

我该如何解释2>&1
Mahesha999 '16

@ Mahesha999 2是STDERR的文件描述符,而1是STDOUT的文件描述符。这样2>&1将STDERR发送到STDOUT。这太问题解释了它相当不错:stackoverflow.com/questions/818255/...
亚伦

20

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

your_command >/path/to/file

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

your_command >>/path/to/file

非常感谢 !有限制吗?喜欢文件的最大大小?
led-Zepp

3
最大文件大小仅受文件系统限制
混乱

此答案将不会保存stderr。使用&>,请参阅stackoverflow.com/questions/637827/…tldp.org/LDP/abs/html/io-redirection.html
Panther

3
OP从未要求保存stderr
混乱

它说“没有这样的文件或目录”。是否也可以自动创建目录?
Qwerty

14

需要考虑的增强功能-

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

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

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

1
如何以节省颜色的方式保存输出?我想在libreoffice中导入命令的结果并保留颜色。
madrang

@madrang:我现在只阅读您的评论,但您可能会发现此答案很有用。
Sylvain Pineau'9

哦,几乎正是我要的东西。如何在屏幕上也打印输出?
Sigur's

1
请注意,许多产生彩色输出的命令(例如lsgrep,support)--color=auto仅在标准输出为终端时才输出颜色代码。
伊莱亚·卡根

5

对于cron作业等,您要避免使用Bash扩展名。等效的POSIX sh重定向运算符为

Bash          POSIX
------------  --------------
foo &> bar    foo >bar 2>&1
foo &>> bar   foo >>bar 2>&1
foo |& bar    foo 2>&1 | bar

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


1

some_command | tee command.logsome_command > command.log存在不能将命令输出command.log实时保存到文件的问题。

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


例:

sudo apt-get install expect
unbuffer some_command | tee command.log
unbuffer some_command > command.log

假设log.py包含:

import time
print('testing')
time.sleep(100) # sleeping for 100 seconds

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

详细信息:如何将命令输出实时保存到文件中?


他们确实会在收到输出时保存输出,问题是当输出未达到TTY时python会打开缓冲。在Python中禁用此功能的其他选项:stackoverflow.com/q/107705/2072269
muru,
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.