将所有输出重定向到 Bash 中的文件 [重复]

Posted

技术标签:

【中文标题】将所有输出重定向到 Bash 中的文件 [重复]【英文标题】:Redirect all output to file in Bash [duplicate] 【发布时间】:2011-10-04 04:44:36 【问题描述】:

我知道在 Linux 中,要将输出从屏幕重定向到文件,我可以使用 >tee。但是,我不确定为什么部分输出仍然输出到屏幕而不写入文件。

有没有办法将所有输出重定向到文件?

【问题讨论】:

【参考方案1】:

所有 POSIX 操作系统have 3 streams:标准输入、标准输出和标准错误。 stdin 是输入,可以接受 stdout 或 stderr。 stdout 是主要输出,使用>>>| 重定向。 stderr 是错误输出,它是单独处理的,因此任何异常都不会传递给命令或写入可能破坏的文件;通常,这会被发送到某种日志,或者直接转储,即使在标准输出被重定向时也是如此。要将两者重定向到同一个地方,请使用:

$command &> /some/file

编辑:感谢 Zack 指出上述解决方案不可移植——请改用:

$command > file 2>&1 

如果您想消除错误,请执行以下操作:

$command 2> /dev/null

【讨论】:

似乎 &> 和 2>&!都在做同样的事情? &> file(又名>& file)不是官方 POSIX shell 规范的一部分,但已作为便利扩展添加到许多 Bourne shell(它最初来自 csh)。在可移植的 shell 脚本中(如果您不需要可移植性,为什么要编写 shell 脚本?),请仅使用 > file 2>&1 &> 未在 sh 中实现,因此请注意从 cron 文件执行的命令,crontabl 使用 sh 运行命令,除非您告诉它使用另一个 shell。【参考方案2】:

这可能是标准错误。你可以重定向它:

... > out.txt 2>&1

【讨论】:

【参考方案3】:

感谢 osexp2003 和 j.a. …


而不是放:

&>> your_file.log

在一行后面:

crontab -e

我用:

#!/bin/bash
exec &>> your_file.log
…

BASH 脚本的开头。

优势:您的脚本中有日志定义。适用于 Git 等。

【讨论】:

正是我想要的,谢谢!就我而言,我没有直接执行脚本(一些我无法控制的包装脚本正在调用它),所以我无法在命令之后指定输入重定向 我很高兴支持你。顺便说一句,我想指出我没有使用的示例(crontab)甚至不起作用,因为 crontab 使用的是 SH 而不是 BASH。为了进一步了解,其他答案可以提供帮助。如果您不知道,&>> /dev/null 仅适用于 BASH,并将 STANDARD_OUT (1) 和 STANDARD_ERROR (2) 重定向到 Nirvana(3 是 STANDARD_IN)。在这种特殊情况下,覆盖 (&>) 或追加 (&>>) 没有区别。【参考方案4】:

例如,在控制台和文件file.txt 中获取输出。

make 2>&1 | tee file.txt

注意:&(在2>&1 中)指定1 不是文件名而是文件描述符。

【讨论】:

顺便提一下, tee -a file.txt 表示追加到文件中。【参考方案5】:

命令:

foo >> output.txt 2>&1

追加output.txt 文件,而不替换内容。

【讨论】:

它在 crontab 中为我工作,用于 R、Ubuntu 14 中的脚本。【参考方案6】:

您可以稍后使用exec 命令重定向任何命令的所有stdout/stderr 输出。

示例脚本:

exec 2> your_file2 > your_file1
your other commands.....

【讨论】:

【参考方案7】:

使用>> 追加:

command >> file

【讨论】:

这个和原问题有关,但不回答。 不回答,但通常被误解,第一个答案实际上暗示 > 和 >> 和 |是可以互换的。即 - 这不值得你投反对票。【参考方案8】:

使用这个 - "require command here" > log_file_name 2>&1

Unix/Linux中重定向操作符的详细说明。

> 运算符通常将输出重定向到文件,但也可以重定向到设备。您也可以使用 >> 来追加。

如果您不指定数字,则假定为标准输出流,但您也可以重定向错误

> file redirects stdout to file
1> file redirects stdout to file
2> file redirects stderr to file
&> file redirects stdout and stderr to file

/dev/null 是一个空设备,它接受你想要的任何输入并将其丢弃。它可以用来抑制任何输出。

【讨论】:

Unix/Linux 中的重定向操作符?哪个壳? 这将在 unix 和 linux 中工作,并且与我们使用的 shell 无关。 显然&>是一些shell支持的扩展,但POSIX没有指定。如果dash 是您的/bin/sh,请准备好它闯入#!/bin/sh 脚本。在破折号中,它与两个单独的命令解析相同:foo &,即在后台运行命令,输出连接到 shell 的标准输出(例如终端),然后分别>output 截断输出文件。其他的是标准语法,它们都在 Bash 和 Zsh 以及现代 GNU/Linux 发行版默认提供的其他典型交互式 shell 中工作。【参考方案9】:

该部分写入stderr,使用2> 重定向它。例如:

foo > stdout.txt 2> stderr.txt

或者如果你想在同一个文件中:

foo > allout.txt 2>&1

注意:这在 (ba)sh 中有效,请检查您的 shell 的语法是否正确

【讨论】:

好吧,我找到了参考资料,并因信息不正确而删除了我的帖子。来自 bash 手册:'"ls 2>&1 > dirlist" 仅将标准输出定向到 dirlist,因为在将标准输出重定向到 dirlist 之前,标准错误已从标准输出中复制了":) 同样出自bash man "重定向标准输出和标准错误有两种格式:&>word和>&word这两种形式,首选第一种。这在语义上相当于>word 2 >&1" 两个重要的补充:如果你想管道 stdout 和 stderr,你必须以与文件工作相反的顺序编写重定向,cmd1 2>&1 | cmd2;将2>&1 放在| 之后会将stderr 重定向到cmd2。如果 stdout 和 stderr 都被重定向,程序仍然可以通过打开 /dev/tty 访问终端(如果有);这通常仅用于密码提示(例如,ssh)。如果您也需要重定向,shell 无法帮助您,但 expect 可以。 > 更改为 >> 以追加而不是覆盖。有点明显,但值得一提。 @DustinGriffith 所以,foo >> allout.txt 2>>&1foo >> allout.txt 2>&1?

以上是关于将所有输出重定向到 Bash 中的文件 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

在 Linux 上使用 Bash 将所有输出重定向到文件? [复制]

在 Bash 中重定向标准错误和标准输出 [重复]

将命令输出重定向到 bash 中的变量失败

将shell输出重定向到文件[重复]

从 bash 脚本本身将 stdout 的副本重定向到日志文件

如何将stdout和stderr都重定向到文件[重复]