如何知道输出是否被重定向到文件?

如何知道输出是否被重定向到文件?

我正在努力显示类似ls命令的输出(只有 ls,没有选项)。我有一个使用系统调用的工作程序。但我在测试时遇到了奇怪的行为,如下所示。

$ ls 
a b c
$ ls > somefile
$ cat somefile
a
b
c

因此,正如您所看到的,输出是每个文件写入一个文件,没有为 LS 提供任何额外的开关。你可以测试一下。因此,从上面我推断,ls如果通过重定向写入文件,命令有一些内置逻辑可以每行显示一个。

更令人困惑的是,我相信 shell 解释了重定向。

所以我很困惑,我想知道如果重定向到文件,到底是什么使输出每行一个?有什么提示吗?

答案1

通常通过测试相关文件句柄是否附加到 tty:

% perl -le 'print -t STDOUT ? "yes" : "no"'
yes
% perl -le 'print -t STDOUT ? "yes" : "no"' > out
% < out
no
% 

或者通过 C,类似:

#include <sys/ioctl.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

...

int foo;
if (ioctl(STDIN_FILENO, FIONREAD, &foo) == -1) {
    printf("yes\n");
} else {
    printf("no\n");
}

相关内容