什么会使Linux中的>静默失败?


20

我运行了以下命令:

python ./manage.py dumpdata partyapp.InvitationTemplate > partyapp_dump.json

将数据转储到partyapp_dump.json文件中。但是,所有数据仅被打印在屏幕上,并且partyapp_dump.json创建了一个空文件。

为什么会发生这种情况?我进行了测试ls > partyapp_dump.json,效果很好。

Answers:


40

使用>只能重定向标准输出。请尝试2>来重定向错误输出。使用&>重定向两者。


1
仅供参考,&>仅适用于Bash 4.0和iirc最新版本的zsh。对于更便携的解决方案,foo > bar 2&>1。参考:mywiki.wooledge.org/BashFAQ/014
Rein Henrichs,

6
@Rein Henrichs:那是2>&1,而不是2&> 1
camh 2011年

我记得在编程时使用了pneumonic(?):'2',to('>')'1'的Location('&')
hometoast 2011年

1
@hometoast:您的意思是助记符?:)肺意味着肺...
carlpett 2011年

22

您的python应用必须将其输出写入STDERR输出通道,而不是正常的STDOUT。使用shell构造>仅捕获并重定向写入输出通道的数据,但是实际上还有其他几个通道可以打印到,最常见的是第二个通道,通常用于错误。

您可以像这样尝试捕获STDERR(第二个通道):

python ./manage.py dumpdata partyapp.InvitationTemplate > partyapp_dump.json 2>&1

2>&1构造将错误输出流连接到正常输出通道。程序生成要在错误通道上捕获的输出是不寻常的。通常将其保留给调试信息而不是应用程序数据。请谨慎使用此脚本,因为它的行为方式不规范。

您也可以像这样将输出和错误通道转储到不同的文件中:

python ./manage.py dumpdata partyapp.InvitationTemplate > partyapp_dump.json 2> error_output.txt

5

除了已经建议的stderr vs stdout输出说明之外,您的应用程序可能会直接忽略这两个流,并显式打开其输出的“ / dev / tty”。


1

如果noclobber设置了bash选项,则>如果目标文件已存在,>重定向将失败(尽管不是无提示)。

为了更好的可移植性,用于cmd >| file强制覆盖任何现有文件。


0

如果您迷路了,可以随时尝试使用strace运行它,以查看正在执行的进程:

strace -f command

1
正确答案,但不特别相关。如果那家伙现在不打算管理错误流,那么我不认为他会知道如何处理an的输出strace
Caleb
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.