isatty()はどのようにして端末から情報を取得しますか?


4

私がタイプすると:

ls --color=auto

または

ls --color=auto | cat
ls --color=auto > >(cat)

同じ出力が表示されません。したがって、プログラムには、そのSTDOUTが何かにパイプされているかどうかを知る能力があると思います。問題は、どのようにそれを知っているのですか?

私はENVのVARSを確認envし、env | cat私は同じことを取得します。答えはどこかにあります。どこがわからない。

この質問から、isatty()この機能を提供する人を使用できることがわかりました。それはシェルまたはカーネルの一部ですか?さらに進むと、この関数はPOSIX標準の一部であることがわかります。

今、私はいくつかのメカニズムでそれらの間で通信できる2つのプロセスがあることを知っています:

  • STDIN / STDOUT / STDERR
  • 終了コード
  • 環境変数
  • システムコール

Bashとlsはどちらもプログラムです。したがって、リストされたメカニズムのみを使用して情報を交換できます。

この背後にある本当の質問はisatty()、bashからどのように情報を取得するのですか?


@Steven-それはまったく別の問題です。
AFH

@AFHはそうではありません。Stevenからの回答で、プログラムがPOSIX関数を使用することがわかりましたisatty()。質問を次のように変更する必要があります:isatty()関数はシェルまたはカーネルにリンクされていますか?
-nowox

1
@スティーブン申し訳ありませんが、私は混乱してXY問題を尋ねました
...-nowox

回答:


5

この--colorオプションは、GNU lsプログラムの機能です。GNU lsはこのisatty()関数を使用して、プロセスの標準出力がTTYかどうかをテストします。関連するソースコードの一部は次のとおりです

    case COLOR_OPTION:
      {
        int i;
        if (optarg)
          i = XARGMATCH ("--color", optarg, color_args, color_types);
        else
          /* Using --color with no argument is equivalent to using
             --color=always.  */
          i = color_always;

        print_with_color = (i == color_always
                            || (i == color_if_tty
                                && isatty (STDOUT_FILENO)));

この背後にある本当の問題は、isatty()がどのようにbashから情報を取得するのかということです。

isatty()渡されたファイル記述子を検査して、ファイル記述子がTTY(端末デバイス)を表すかどうかを確認します。isatty()の正確な動作方法は、システムごとに異なる場合があります。ここにあるダーウィンの実装もし興味があるなら、アップルOSXから:

#include <termios.h>
#include <unistd.h>

int
isatty(fd)
    int fd;
{
    struct termios t;

    return(tcgetattr(fd, &t) != -1);
}

を実行するls --color=autoと、シェル(bash)はシェルの標準入力、出力、およびエラーを「ls」プロセスのstdin / out / errとして使用して「ls」プログラムを起動します。対話的に実行している場合、シェルの標準出力はおそらく端末であり、lsの標準出力はおそらく端末です。lsがisatty()を呼び出して、標準出力が端末かどうかをテストすると、おそらく成功します。

のようなものを実行するとls --color=auto | cat、シェルは次の3つのことを行います。

  1. パイプを作成します。
  2. cat標準入力がパイプになるように設定して起動します。
  3. ls標準出力がパイプになるように設定して起動します。

パイプは端末ではありません。ときlsのテストは、その標準出力がttyであるかどうか、テストは失敗します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.