出力がファイルにリダイレクトされるかどうかはどうすればわかりますか? [コピー]

出力がファイルにリダイレクトされるかどうかはどうすればわかりますか? [コピー]

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");
}

おすすめ記事