将程序输出重定向到文件失败

将程序输出重定向到文件失败

所以我有一个程序,我们称之为 foo。我正在尝试使用以下命令将其终端输出重定向到文件。

foo > ./someFile.txt

现在,当我运行该命令时,会创建 someFile.txt 但它是空的。关于如何重定向终端输出有什么建议吗?

答案1

someFile.txt将创建一个文件是预期的行为。该文件是否包含任何内容取决于您的程序foo应该执行的操作。

无论您遇到什么问题,似乎都与输出重定向无关。您可以尝试以下命令作为测试:

cat > someFile.txt

键入任何内容。您输入的任何内容都将被重定向到(以+someFile.txt结尾)。ctrld

顺便说一句,输出文件是由您的 shell 创建的,而不是由您的程序创建的foo。即使您输入不存在的命令,仍然会创建输出文件(空):

/bin/nonexistent > zzz

答案2

另一种可能性是,如果标准输出没有指向交互的地方,则foo使用并且不向标准输出写入任何内容。isatty

概要

#include <unistd.h>
int isatty(int fd);

描述 isatty() 函数测试 fd 是否是引用终端的打开文件描述符。

这个简短的 Python 程序演示了这一点:

import sys, os

if sys.stdout.isatty():
    print "Hello, tty %s" % os.ttyname(1)
else:
    print "stdout: not a typewriter: how boring"

正如这个简短的 C 程序一样:

#include <stdio.h>
#include <unistd.h>

int main (void) {
    if ( isatty(stdout) ) {
        printf("Hello, tty %s\n", ttyname(1));
    } else {
        printf("stdout: not a typewriter: how boring\n");
    }
    return 0;
}

两个程序具有相同的行为:

$ ./isatty > notatty ; cat notatty
stdout: not a typewriter: how boring

$ ./isatty.py
Hello, tty /dev/pts/1

$ ./isatty | cat
stdout: not a typewriter: how boring

程序可以根据是否重定向来选择打印方式、打印内容以及是否打印。

这样做的一个常见应用是避免将终端(\e[33;1m等)读取的用于文本着色的 ANSI 转义序列写入文件,这看起来很丑陋并且使解析器感到困惑。

答案3

我有同样的问题。我的程序日志没有按预期写入 [stdout],而是写入 [stderr]。因此,解决方案是重定向 [stdout] 和 [stderr]:

foo >> someFile.txt 2>&1

相关内容