9

gitを使用すると、標準出力がパイプを経由するのかファイルに入るのか、コンソールに表示されるのかを魔法のように知っているようです。たとえば、色を有効にしていて、

git status

リストされているファイルのさまざまなカテゴリの出力に色が付けられます。ただし、そうする場合

git status | less

また

git status > status.txt

Linuxのカラーフォーマットが削除され、無地の色なしのテキストのみが表示されます。

gitコマンドの出力がファイルに送信されるのか、端末に送信されるのかをどのように検出しますか?

4

4 に答える 4

14

isatty(int fd)fdが端末または他の何かを参照しているかどうかを確認します。これunistd.hはGNUCライブラリの一部です。

マニュアルページ: http: //linux.die.net/man/3/isatty

余談ですが、別のプログラムを使用してプログラムから読みたいがisatty、自分のプログラムが人間であると騙されたい場合は、それを行う方法があります。疑似端末(pty)を使用できます。この手法は、たとえば、expectで使用されます。

于 2010-01-26T21:34:58.623 に答える
8

これは、標準出力がリダイレクトされているかどうかを検出する方法を示すCコードです。

int main(int argc、char ** argv){
    if(!isatty(fileno(stdout))){
      fprintf(stdout、 "argv、argc、誰かが私を別の場所にリダイレクトしています... \ n");
      1を返します。
    }
    /*残りのCコードはここにあります...*/
}

これが、出力がターミナルに送信されるのかファイルに送信されるのかをgitが認識する方法です。

于 2010-01-26T21:38:54.567 に答える
3

それがgitが依存していることを確認できます:

$ grep -ir "isatty" ./*
./builtin-commit.c:     if (isatty(0))
./builtin-config.c:         stdout_is_tty = isatty(1);
./builtin-pack-objects.c:   progress = isatty(2);
./builtin-prune-packed.c:   int opts = isatty(2) ? VERBOSE : 0;
./builtin-revert.c: if (isatty(0))
./builtin-shortlog.c:   if (!nongit && !rev.pending.nr && isatty(0))
./builtin-unpack-objects.c: quiet = !isatty(2);
./color.c:      stdout_is_tty = isatty(1);
./compat/winansi.c: if (!isatty(fileno(stream)))
./compat/winansi.c: if (!isatty(fileno(stream)))
./pack-redundant.c: if (!isatty(0)) {
./pager.c:  if (!isatty(1))
./pager.c:  if (isatty(2))
./remote-curl.c:    options.progress = !!isatty(2);
./transport.c:  args.no_progress = args.quiet || (!transport->progress && !isatty(1));
./transport-helper.c:   int no_progress = v < 0 || (!t->progress && !isatty(1));
./wt-status.c:   * will have checked isatty on stdout).

gitソースツリーに対して実行します。

fds 0 = stdin、1 = stdout、2 = stderrがデフォルトであることに注意してください。ただし、これらはもちろんリダイレクトまたは閉じることができます(通常、デーモンの場合は、ファイル記述子を閉じて、必要なものを再度開きます)。

于 2010-01-26T21:40:35.613 に答える
3

シェルスクリプト-tから、ファイル記述子0(標準入力)に適用されたテストフラグを使用します。

例:

# Any Bourne-style shell
[ -t 0 ] && echo This is a terminal

# Modern interactive shells: ksh, bash, zsh
[[ -t 0 ]] && echo This is a terminal
于 2013-05-20T20:04:35.850 に答える