将所有输出重定向到 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>>&1
或 foo >> allout.txt 2>&1
?以上是关于将所有输出重定向到 Bash 中的文件 [重复]的主要内容,如果未能解决你的问题,请参考以下文章
在 Linux 上使用 Bash 将所有输出重定向到文件? [复制]