В Linux, как я могу протестировать, идет ли вывод программы в живой терминал или в файл?

При использовании мерзавца, это, кажется, волшебно знает, проходит ли стандарт канал или в файл по сравнению с тем, когда это отображается к консоли. Например, если у Вас есть включенные цвета, и Вы делаете

git status

это будет colorize вывод для различных категорий перечисляемых файлов. Однако, если Вы делаете

git status | less

или

git status > status.txt

это удаляет форматирование цвета Linux, и Вы только видите простой, бесцветный текст.

Как делает git обнаружьте, собирается ли вывод его команд зарегистрировать по сравнению с движением к терминалу?

8
задан Ross Rogers 26 January 2010 в 21:57
поделиться

3 ответа

Isatty (INT FD) проверит, относится ли FD к терминалу или что-то еще. Это часть Unistd.h в библиотеке GNU C.

Человек: http://linux.die.net/man/3/isatty

в сторону: если вы хотите прочитать из программы, используя другую программу, но вы хотите обмануть Isatty , думая, что ваша программа является человеком, есть способ сделать это. Вы можете использовать псевдо- псевдо- (PTY). Эта техника используется , например .

14
ответ дан 5 December 2019 в 06:09
поделиться

Это код 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 знает, отправляется ли выход к терминалу или в файл.

8
ответ дан 5 December 2019 в 06:09
поделиться

может подтвердить, что полагается в 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 по умолчанию, но, конечно, можно повторно направить или закрыть (как правило, если вы являетесь демоном, вы закрываете свои файловые дескрипторы и снова откроете свои хочу).

3
ответ дан 5 December 2019 в 06:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: