このようなコマンドは、標準出力がls
何であるかをどうやって知ることができますか?
ls
ターゲット標準出力によって動作が異なるようです。たとえば、これを行うと:
ls /home/matt/tmp
結果:
a.txt b.txt c.txt
しかし、もし私がそうするなら
ls /home/matt/tmp | cat
結果は次のとおりです(つまり、各結果は新しい行を置き換えます)。
a.txt
b.txt
c.txt
プロセスには、stdoutのファイル記述子1が渡されます。そうですか?結果の書式設定方法はどのように決定されますか?ファイル記述子は情報を漏洩していますか?
ベストアンサー1
このプログラムは、fd 1がttyか他のもの(パイプ、ファイルなど...)であるかを判断するls
ために使用されます。isatty()
からman 3 isatty
:
int isatty(int fd);
説明
このisatty()
関数は、fd
開かれたファイル記述子が端末を参照するかどうかをテストします。
修正する:coreutilsの行1538 ls.c
(gitリビジョン43a987e1):
if (isatty (STDOUT_FILENO))
{
format = many_per_line;
/* See description of qmark_funny_chars, above. */
qmark_funny_chars = true;
}
(many_per_line
自己説明が必要です。)