我正在努力显示类似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");
}