【发布时间】:2011-10-04 04:44:36
【问题描述】:
我知道在 Linux 中,要将输出从屏幕重定向到文件,我可以使用 > 或 tee。但是,我不确定为什么部分输出仍然输出到屏幕而不写入文件。
有没有办法将所有输出重定向到文件?
【问题讨论】:
标签: linux bash io-redirection
我知道在 Linux 中,要将输出从屏幕重定向到文件,我可以使用 > 或 tee。但是,我不确定为什么部分输出仍然输出到屏幕而不写入文件。
有没有办法将所有输出重定向到文件?
【问题讨论】:
标签: linux bash io-redirection
所有 POSIX 操作系统have 3 streams:标准输入、标准输出和标准错误。 stdin 是输入,可以接受 stdout 或 stderr。 stdout 是主要输出,使用>、>> 或| 重定向。 stderr 是错误输出,它是单独处理的,因此任何异常都不会传递给命令或写入可能破坏的文件;通常,这会被发送到某种日志,或者直接转储,即使在标准输出被重定向时也是如此。要将两者重定向到同一个地方,请使用:
$command &> /some/file
编辑:感谢 Zack 指出上述解决方案不可移植——请改用:
$command > file 2>&1
如果您想消除错误,请执行以下操作:
$command 2> /dev/null
【讨论】:
&> file(又名>& file)不是官方 POSIX shell 规范的一部分,但已作为便利扩展添加到许多 Bourne shell(它最初来自 csh)。在可移植的 shell 脚本中(如果您不需要可移植性,为什么要编写 shell 脚本?),请仅使用 > file 2>&1。
这可能是标准错误。你可以重定向它:
... > out.txt 2>&1
【讨论】:
感谢 osexp2003 和 j.a. …
而不是放:
&>> your_file.log
在一行后面:
crontab -e
我用:
#!/bin/bash
exec &>> your_file.log
…
在 BASH 脚本的开头。
优势:您的脚本中有日志定义。适用于 Git 等。
【讨论】:
&>> /dev/null 仅适用于 BASH,并将 STANDARD_OUT (1) 和 STANDARD_ERROR (2) 重定向到 Nirvana(3 是 STANDARD_IN)。在这种特殊情况下,覆盖 (&>) 或追加 (&>>) 没有区别。
例如,在控制台和文件file.txt 中获取输出。
make 2>&1 | tee file.txt
注意:&(在2>&1 中)指定1 不是文件名而是文件描述符。
【讨论】:
命令:
foo >> output.txt 2>&1
追加到 output.txt 文件,而不替换内容。
【讨论】:
您可以稍后使用exec 命令重定向任何命令的所有stdout/stderr 输出。
示例脚本:
exec 2> your_file2 > your_file1
your other commands.....
【讨论】:
使用>> 追加:
command >> file
【讨论】:
使用这个 - "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 是一个空设备,它接受你想要的任何输入并将其丢弃。它可以用来抑制任何输出。
【讨论】:
&>是一些shell支持的扩展,但POSIX没有指定。如果dash 是您的/bin/sh,请准备好它闯入#!/bin/sh 脚本。在破折号中,它与两个单独的命令解析相同:foo &,即在后台运行命令,输出连接到 shell 的标准输出(例如终端),然后分别>output 截断输出文件。其他的是标准语法,它们都在 Bash 和 Zsh 以及现代 GNU/Linux 发行版默认提供的其他典型交互式 shell 中工作。
该部分写入stderr,使用2> 重定向它。例如:
foo > stdout.txt 2> stderr.txt
或者如果你想在同一个文件中:
foo > allout.txt 2>&1
注意:这在 (ba)sh 中有效,请检查您的 shell 的语法是否正确
【讨论】:
cmd1 2>&1 | cmd2;将2>&1 放在| 之后会将stderr 重定向到cmd2。如果 stdout 和 stderr 都被重定向,程序仍然可以通过打开 /dev/tty 访问终端(如果有);这通常仅用于密码提示(例如,ssh)。如果您也需要重定向,shell 无法帮助您,但 expect 可以。
> 更改为 >> 以追加而不是覆盖。有点明显,但值得一提。
foo >> allout.txt 2>>&1 或 foo >> allout.txt 2>&1?