有没有不用任何软件的方法吗?我想知道。
#1 楼
是的,有可能,只需将输出(AKAstdout
)重定向到文件:SomeCommand > SomeFile.txt
,或者如果您想追加数据:
SomeCommand >> SomeFile.txt
如果还要
stderr
,请使用此:SomeCommand &> SomeFile.txt
或要附加的内容:
SomeCommand &>> SomeFile.txt
如果要在控制台和文件中同时显示
stderr
和输出,请使用此:SomeCommand 2>&1 | tee SomeFile.txt
(如果只需要输出,请放下上面的
2
)#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.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
假设
log.py
包含:import time
print('testing')
time.sleep(100) # sleeping for 100 seconds
您可以运行
unbuffer python log.py | tee command.log
或unbuffer 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
评论
注意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