Unix[のような]プログラムは、出力先を決定できますか?

Unix[のような]プログラムは、出力先を決定できますか?

最近まで、Unix 系プログラムは、出力が標準出力、ファイルにリダイレクト、パイプのいずれに送られるかを認識していないという印象を持っていました。しかし、このサイトの無関係な U&L の質問によって、次の例に気付きました。

% echo "hello world" > file

% grep --color=auto lo file
hello world

% grep --color=auto lo file | cat
hello world

もちろん、ここでは見えませんが、最初のコマンドでは、予想どおり「lo」が強調表示されます。ただし、パイプを通過する 2 番目の呼び出しでは、色は表示されません。これは、grep出力がパイプに向けられていることを認識し、色を出力しないようにしたことを示しています。これはどのように行われるのでしょうか。

答え1

ファイル記述子が tty を参照しているかどうかを判断することができます。

チェックアウト関数isatty

あるいは、関数fstatこれにより、ファイルに関する大量の情報が提供されます。

答え2

はい、そうです。出力先を決定する方法はいくつかあります。比較については、stackoverflowの関連質問に対する私の回答を参照してください。

答え3

簡単です。出力先を決定するにはさまざまな方法があります。Pythonでは次のようにできます。

    /* CODE. Input will be parsed and executed */
int
PyRun_AnyFileExFlags(FILE *fp, const char *filename, int closeit,
                     PyCompilerFlags *flags)
       {
    if (filename == NULL)
        filename = "???";
    if (Py_FdIsInteractive(fp, filename)) {
        int err = PyRun_InteractiveLoopFlags(fp, filename, flags);

関連情報