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

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

#1 楼

是的,有可能,只需将输出(AKA stdout)重定向到文件:
SomeCommand > SomeFile.txt  

,或者如果您想追加数据:
SomeCommand >> SomeFile.txt

如果还要stderr,请使用此:
SomeCommand &> SomeFile.txt  

或要附加的内容:
SomeCommand &>> SomeFile.txt  

如果要在控制台和文件中同时显示stderr和输出,请使用此:
SomeCommand 2>&1 | tee SomeFile.txt

(如果只需要输出,请放下上面的2

评论


注意someCommand 2> someFile.txt和someCommand 2 >> someFile.txt也会将stterr重定向到someFile.txt

– Slothworks
15年8月29日在13:32

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

– Nikos
16-9-29在13:40

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

–乔纳森·哈特利
17年9月14日在13:29

注意:要将make命令的输出转换成文件,需要使用以下语法:make> someFile.txt 2>&1(来源:linuxquestions.org/questions/linux-newbie-8/…)

–加百利·斯台普斯
18年1月15日,0:49

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

–relG
18-10-27在8:02

#2 楼

要将命令输出写入文件,基本上有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?”。关于堆栈溢出的一些方法可以做到这一点,例如通过交换流或使用进程替换。


command |& tee output.txt

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


command |& tee -a output.txt

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



评论


谢谢你的餐桌,很棒!这应该是最佳答案

–DevShark
16年8月15日在16:24

@ karthick87这与将输出重定向到文件的问题并没有真正的关系,因为它只是将一个流重定向到另一个。 2>&1将STDERR重定向到STDOUT,1>&2将STDOUT重定向到STDERR,3>&1将流3重定向到STDERR。

–Byte Commander♦
16-09-19的16:42

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

–丹尼·帕克(Danny Parker)
17年5月9日在10:01

@ByteCommander我得到以下错误:sh:1:语法错误:当我在c9.io服务器中的Python脚本中使用|&tee时,出现意外的“&”错误。似乎正在使用其他外壳。 echo $ SHELL显示/ bin / bash和$ SHELL --version显示版本4.3.11(1)-release。我在python脚本中尝试了#!/ bin / bash,但仍然得到sh:1:语法错误。我得到了我所需要的,所以我放弃了对服务器上sh和bash之间的怪异排序。谢谢。

– samkhan13
18年1月28日在3:09

@ samkhan13看起来您正在运行sh而不是bash(或者可能是sh模式下的bash ...)。您可以使用ps -p $$ -o cmd =来检查您当前的shell进程究竟是什么,因为echo $ SHELL是不可靠的,并且会向您显示您的登录shell,而忽略您是否已经启动了另一个子shell。

–Byte Commander♦
18年1月28日在12:35

#3 楼

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

command | tee ~/outputfile.txt


稍​​作修改也会捕获stderr:

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


或稍短且不太复杂:

command |& tee ~/outputfile.txt


tee如果希望能够捕获命令输出并同时实时查看它,则很有用。 br />

评论


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

–tim687
16年4月6日在13:51

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

–亚伦
16年4月6日在14:11

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

–tim687
16-4-7的6:43

如何解释2>&1的含义?

–玛哈
16年7月15日在7:47

除了2>&1 |,还可以简单地使用|&。

–Byte Commander♦
16-10-7在17:47

#4 楼

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

your_command >/path/to/file


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

your_command >>/path/to/file


评论


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

–led-Zepp
14年2月14日在19:55

最大文件大小仅受文件系统限制

–混乱
14年2月14日在19:59

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

–豹
14年2月14日在20:16

OP从未要求保存stderr

–混乱
14年2月14日在20:18

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

– Qwerty
19年5月22日在9:27

#5 楼

要考虑的增强功能-

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

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

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


评论


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

– madrang
15年5月12日在6:36

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

–西尔文·皮诺(Sylvain Pineau)
2015年9月21日在10:41

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

– Sigur
16 Dec 23 '22:10



请注意,许多产生彩色输出的命令(例如ls和grep)都支持--color = auto,仅当标准输出是终端时才输出颜色代码。

– Eliah Kagan
17年3月3日14:37在

#6 楼

对于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语法,这应该已经使您确信这是个坏主意。

#7 楼

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


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


第二个问题在正文中:


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


这里发布的所有答案都针对第二个问题,而没有一个针对第一个问题在Unix和Linux中有一个很好的答案的问题:


将所有终端输出保存到文件中

此答案使用了一个鲜为人知的命令script直到您键入exit为止,所有shell的输出都将输出到文本文件中。命令输出仍然出现在屏幕上,但也出现在文本文件中。

过程很简单。使用:

$ script ~/outputfile.txt
Script started, file is /home/rick/outputfile.txt
$ command1
$ command2
$ command3
$ exit
exit
Script done, file is /home/rick/outputfile.txt


然后使用以下命令查看记录的命令1、2和3的输出:

cat ~/outputfile.txt


这类似于先前的答案:

command |& tee ~/outputfile.txt



,但是不必在每个|& tee ~/outputfile.txt之后使用commnd
script命令在启动时重新加载~/.bashrc增加了优点(或缺点)。
script命令显示命令提示符($PS1),后跟您输入的命令。
script命令记录了以下内容中的所有详细信息全彩。


评论


+1 :-)我在以下情况下使用脚本:如果缓慢的命令行过程需要引起我的注意,请叫醒我?

– sudodus
19/12/31在0:09



@sudodus +1在那里的链接答案。我从未梦想过将脚本用于此类应用程序:)

–WinEunuuchs2Unix
19年12月31日在0:16

脚本很棒,非常感谢!

– Stromael
12月14日14:30

#8 楼

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
18年7月5日在2:22

谢谢!花了这么长时间寻找,这正是我所需要的。使用Google Assistant脚本中的stdout。

–anonymous2
19/12/26在2:23

您不需要安装Expect,stdbuf会做同样的事情,并且通常已经在您的发行版中了。您可以“行缓冲”,它仍然具有一些缓冲并节省时间的优势,或者完全“取消缓冲”。

–扎卡尔
8月23日18:06