所以我有一个程序,我们称之为 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