ls
私はコマンドのような出力を表示するのに苦労しています(lsだけでオプションなし)。システムコールを使用するワーカープログラムがあります。ところでテストをしていたところ、以下のような奇妙な現象が発生しました。
$ ls
a b c
$ ls > somefile
$ cat somefile
a
b
c
したがって、見てわかるように、LSへの追加スイッチなしの出力は、作成されたファイルごとに1つのファイルです。テストできます。したがって、上記の内容を介してls
リダイレクトを介してファイルに書き込む場合、コマンドに1行に1つずつ表示する組み込みロジックがあることを推論しました。
問題をより混乱させるために、シェルはリダイレクトを解釈すると思います。
だから、混乱してファイルにリダイレクトされた場合、出力が1行に1つずつ正確に生成されるのはなぜですか?どのようなヒントがありますか?
ベストアンサー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");
}