是什么让 `>` 在 Linux 中悄然失败?

Ram*_*hum 20 linux bash

我运行了这个命令:

python ./manage.py dumpdata partyapp.InvitationTemplate > partyapp_dump.json
Run Code Online (Sandbox Code Playgroud)

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

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

小智 40

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

  • @Rein Henrichs:那是 2>&1,而不是 2&>1 (6认同)

Cal*_*leb 22

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

您也可以尝试捕获 STDERR(第二通道),如下所示:

python ./manage.py dumpdata partyapp.InvitationTemplate > partyapp_dump.json 2>&1
Run Code Online (Sandbox Code Playgroud)

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

您还可以将输出和错误通道转储到不同的文件,如下所示:

python ./manage.py dumpdata partyapp.InvitationTemplate > partyapp_dump.json 2> error_output.txt
Run Code Online (Sandbox Code Playgroud)


jll*_*gre 5

除了已经建议的 stderr 与 stdout 输出解释之外,您的应用程序可能会简单地忽略这两个流并为其输出显式打开“/dev/tty”。