什么会导致 `>` 在 Linux 中悄然失败?

什么会导致 `>` 在 Linux 中悄然失败?

我运行了这个命令:

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

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

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

答案1

>你只需重定向标准输出。尝试2>而是重定向错误输出。使用&>重定向两者。

答案2

您的 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

答案3

除了已经建议的 stderr 与 stdout 输出解释之外,您的应用程序可能只是忽略这两个流并明确打开“/dev/tty”作为其输出。

答案4

如果你迷路了,你可以尝试用 strace 运行它来查看进程正在做什么:

strace -f command

相关内容