Answers:
是的,可以,只需将输出重定向到文件:
SomeCommand > SomeFile.txt
或者,如果您想附加数据:
SomeCommand >> SomeFile.txt
如果您也想stderr
使用此功能:
SomeCommand &> SomeFile.txt
或追加:
SomeCommand &>> SomeFile.txt
如果要在控制台和文件中同时显示stderr
和输出,请使用以下命令:
SomeCommand 2>&1 | tee SomeFile.txt
(如果只需要输出,则删除2
上面的内容)
make
命令输出输出到文件中,它需要使用以下语法:(make > someFile.txt 2>&1
来源:linuxquestions.org/questions/linux-newbie-8/…)
要将命令的输出写入文件,基本上有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
标准输出流和标准错误流都将复制到文件,同时仍在终端中可见。如果文件已经存在,则新数据将附加到文件末尾。
2>&1
将STDERR重定向到STDOUT,1>&2
将STDOUT重定向到STDERR,3>&1
并将流3重定向到STDERR。
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
。我得到了我所需要的,所以我放弃了对服务器之间sh
和bash
服务器上的异常进行排序。谢谢。
sh
而不是在运行bash
(或可能bash
处于sh
模式下...)。您可以检查当前外壳程序进程使用的是什么ps -p $$ -o cmd=
,因为echo $SHELL
它不可靠,并且会向您显示您的登录外壳程序,而无需考虑您是否已启动其他子外壳程序。
您还可以使用tee
将输出发送到文件:
command | tee ~/outputfile.txt
稍作修改也将捕获stderr:
command 2>&1 | tee ~/outputfile.txt
或稍短且不太复杂:
command |& tee ~/outputfile.txt
tee
如果您希望既能捕获命令输出又能实时查看它,则该功能很有用。
2>&1
?
您可以将命令输出重定向到文件:
your_command >/path/to/file
要将命令输出附加到文件而不是覆盖文件,请使用:
your_command >>/path/to/file
需要考虑的增强功能-
各种脚本会将颜色代码注入到您可能不希望使日志文件混乱的输出中。
要解决此问题,您可以使用sed程序删除这些代码。例:
command 2>&1 | sed -r 's/'$(echo -e "\033")'\[[0-9]{1,2}(;([0-9]{1,2})?)?[mK]//g' | tee ~/outputfile.txt
ls
和grep
,support)--color=auto
仅在标准输出为终端时才输出颜色代码。
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
详细信息:如何将命令输出实时保存到文件中?
someCommand 2> someFile.txt
并且someCommand 2>> someFile.txt
还会重定向stterr
到someFile.txt