При использовании мерзавца, это, кажется, волшебно знает, проходит ли стандарт канал или в файл по сравнению с тем, когда это отображается к консоли. Например, если у Вас есть включенные цвета, и Вы делаете
git status
это будет colorize вывод для различных категорий перечисляемых файлов. Однако, если Вы делаете
git status | less
или
git status > status.txt
это удаляет форматирование цвета Linux, и Вы только видите простой, бесцветный текст.
Как делает git
обнаружьте, собирается ли вывод его команд зарегистрировать по сравнению с движением к терминалу?
Isatty (INT FD)
проверит, относится ли FD к терминалу или что-то еще. Это часть Unistd.h
в библиотеке GNU C.
Человек: http://linux.die.net/man/3/isatty
в сторону: если вы хотите прочитать из программы, используя другую программу, но вы хотите обмануть Isatty
, думая, что ваша программа является человеком, есть способ сделать это. Вы можете использовать псевдо- псевдо- (PTY). Эта техника используется , например .
Это код C для демонстрации того, как обнаружить, если стандартный вывод перенаправлен:
int main(int argc, char **argv){ if (!isatty(fileno(stdout))){ fprintf(stdout, "argv, argc, someone is redirecting me elsewhere...\n"); return 1; } /* rest of C code here... */ }
, именно то, как GIT знает, отправляется ли выход к терминалу или в файл.
может подтвердить, что полагается в 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 по умолчанию, но, конечно, можно повторно направить или закрыть (как правило, если вы являетесь демоном, вы закрываете свои файловые дескрипторы и снова откроете свои хочу).