要将stdout重定向到bash中的截断文件,我知道要使用:
要重定向bash中的stdout,附加到一个文件,我知道要使用:
要将stdout和stderr重定向到截断的文件,我知道要使用:
如何重定向附加到文件的stdout和stderr?埃多克斯一〔0〕没有为我工作。
- 我要注意,outfile是一个bash(和其他)特定的代码,不可移植。可移植的方法(类似于附加答案)始终是并且仍然是>outfile 2>1
bash执行从左到右的重定向,如下所示:
>>file.txt:在追加模式下打开file.txt,重定向stdout。
2>&1:将stderr改为"stdout目前的发展方向"。在本例中,这是以追加模式打开的文件。换句话说,&1重用了stdout当前使用的文件描述符。
- 工作很棒!但是有没有一种方法可以解释这个问题,或者我应该把它当作一个原子bash构造来处理?
- 这是一个简单的重定向,重定向语句总是从左到右进行计算。>文件:红色。标准输出到文件(附加模式)(1>>文件的缩写)2>>&;1:红色。stderr to"where stdout goes"注意"redirect stderr to stdout"的解释是错误的。
- 它表示"将输出(stdout,文件描述符1)附加到file.txt,并将stderr(文件描述符2)发送到与fd1相同的位置"。
- @但是,如果我需要将stderr重定向到另一个文件,但要附加文件呢?这有可能吗?
- 如果你这样做,它应该达到你想要的。
- hum@thebonsai和其他用户的评论对我来说似乎很清楚,但是:来自:cron-subject(…)-message:EDOCX1(每小时一次)。stderr是否排除segfault?
- @彭赛-我也在试图理解命令背后的原因。您以前的解释非常有用,但是请您通过以下内容详细说明一下:为什么"cmd>>file.log 2>>&;1"将(通过附加)stderr重定向到stdout所在的位置,而"cmd>>file.log 2>>&;1"将(到截断的文件)stderr重定向到stderr所在的位置?
- @穆罕默德胡辛巴?我?:你第一个使用2>>&1的机器不工作。这不是重定向,而是复制文件描述符。因为您在附加模式下将stdout重定向到一个文件,所以您要将该fd复制到stderr,使其处于同一模型中。2>&1是正确的。
- 这不是抑制了stdin吗?如何使用此选项保持程序的stdin活动?例如,如果我有一个Java程序,可以读取用户输入,它的STDUT和STD错误,我想重定向到日志?
- @克里斯特:这个命令根本不影响stdin。但是,用户自然不会看到Java程序的输出,因为它会转到一个文件而不是终端。如果你想两者兼得,你需要使用tee。
根据您的bash版本,有两种方法可以做到这一点。
经典的便携式(bash pre-4)方法是:
一个不可移植的方法,从bash 4开始是
(模拟&> outfile)
为了获得良好的编码风格,您应该
- 决定是否需要考虑可移植性(然后使用经典方法)
- 决定是否需要考虑可移植性,即使是bash pre-4(然后使用经典方法)
- 无论使用哪种语法,都不要在同一个脚本中更改它(混淆!)
如果您的脚本已经以#!/bin/sh开头(无论是否有意),那么bash 4解决方案,以及通常任何bash特定的代码,都不是解决方案。
还要记住,bash 4 &>>只是较短的语法——它不引入任何新功能或类似的功能。
这里描述的语法(除了其他重定向语法之外):http://bash hacker.org/wiki/doku.php/syntax/redientation appending_rediented_output_and_error_output
- 我更喜欢&;>>,因为它与&;>和>>一致。"将输出和错误附加到此文件"比"将错误发送到输出,将输出附加到此文件"更容易读取。注意,虽然Linux通常具有bash的当前版本,但在编写时,OS X仍然需要通过自制等手动安装bash 4。
- 我更喜欢它,因为它较短,每行只有两个位置,所以zsh会用"&;>>"做什么?
- 同样需要注意的是,在cron作业中,即使系统有bash4,也必须使用pre-4语法。
- @zsero cron根本不使用bash…它使用sh。您可以通过将SHELL=/bin/bash预先附加到crontab -e文件来更改默认shell。
在bash中,您还可以显式地指定重定向到不同的文件:
1
| cmd >log.out 2>log_error.out |
附录将是:
1
| cmd >>log.out 2>>log_error.out |
- 使用第一个选项将两个流重定向到同一个文件将导致第一个流在第二个流的顶部写入,覆盖部分或全部内容。使用cmd>>log.out 2>log.out代替。
- 谢谢你接住了,你说得对,一个会打倒另一个。但是,您的命令也不起作用。我认为写入同一个文件的唯一方法是像在cmd >log.out 2>&1之前那样。我正在编辑我的答案以删除第一个示例。
在bash 4(以及zsh 4.3.11)中:
刚出盒
- @Aoeaoe:这实际上也适用于bash4。
- @所有:这是一个很好的答案,因为它与bash一起工作并且很简短,所以我已经编辑了以确保它明确地提到bash。
- @Mikemacana:Thebonsai的答案显示了自2009年以来的bash4解决方案
这应该很有效:
1
| your_command 2>&1 | tee -a file.txt |
它将所有日志存储在file.txt中,并将其转储到终端上。
试试这个
1
| You_command 1>output.log 2>&1 |
您对&;>x.file的使用确实适用于bash4。对不起:(
这里有一些额外的提示。
0、1、2…9是bash中的文件描述符。
0代表stdin,1代表stdout,2代表stderror。3~9备用,用于其他临时用途。
任何文件描述符都可以使用操作符>或>>重定向到其他文件描述符或文件。
用途:>
请参考http://www.tldp.org/ldp/abs/html/io-redirection.html
- 您的示例将执行与OP要求不同的操作:它将把You_command的stderr重定向到stdout,将You_command的stdout重定向到output.log文件。此外,它不会附加到文件,但会覆盖该文件。
- 正确:对于所有其他文件,文件描述符可以是大于3的任何值。
- 您的答案显示了最常见的输出重定向错误:将stderr重定向到stdout当前指向的位置,并且仅在将stdout重定向到文件之后。这不会导致stderr重定向到同一文件。重定向的顺序很重要。
- 这是否意味着,我应该首先将stderror重定向到stdout,然后将stdout重定向到文件。1 > output.log 2>&1
- @昆图斯。周,是的。您的版本将err重定向到out,同时将out重定向到file。
我很惊讶,近十年来,还没有人发布这种方法:
如果在没有&>>的情况下使用较旧版本的bash,您还可以执行以下操作:
这产生了一个子外壳,因此它的效率比传统的cmd >> file.txt 2>&1方法低,但我觉得这种方法更自然,更容易理解:
将stderr重定向到stdout。
通过附加到文件来重定向新的stdout。
此外,圆括号还消除了顺序的任何模糊性,特别是如果您希望将stdout和stderr管道传输到另一个命令。
- 好啊。4年后你得到了认可。这就是艺术的本质,在得到认可之前,你有时间去死;o)