En Linux, ¿cómo puedo comprobar si la salida de un programa va a un terminal activo o en un archivo?

StackOverflow https://stackoverflow.com/questions/2142796

Pregunta

Cuando se utiliza git parece saber si mágicamente a cabo norma está atravesando una tubería o en un archivo vs cuando se visualiza en la consola. Por ejemplo, si usted tiene permitido colores y hacer

git status

se colorear la salida para las diferentes categorías de los archivos que se enumeran a continuación. Sin embargo, si lo hace

git status | less

o

git status > status.txt

se elimina la href="http://www.ibm.com/developerworks/linux/library/l-tip-prompt/" rel="noreferrer"> Linux de color y sólo usted ver, texto sin formato sin color.

¿Cómo git detectar si la salida de sus comandos van a archivo vs ir a la terminal?

¿Fue útil?

Solución

isatty(int fd) comprobará si el fd se refiere a un terminal o algo más. Es parte de unistd.h en la biblioteca de C de GNU.

Hombre página: http://linux.die.net/man/3/isatty

Como acotación al margen: si desea leer de un programa utilizando otro programa, pero quiere engañar a isatty en el pensamiento de que su programa es un ser humano, hay una manera de hacerlo. Puede utilizar un pseudo-terminal (Pty). Esta técnica se utiliza por esperar , por ejemplo.

Otros consejos

Este es un código C para demostrar cómo detectar si se redirige la salida estándar:

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... */
}

Esa es la forma en Git sabe si la salida va a la terminal o en un archivo.

puede confirmar eso es lo que Git se basa en:

$ 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).

Ejecutar contra el árbol fuente de Git.

Tenga en cuenta que FDS 0 = entrada estándar, 1 = salida estándar, 2 = stderr por defecto, pero estos pueden, por supuesto, ser re-dirigido o cerrado (por lo general, si usted es un demonio cierras los descriptores de archivos y volver a abrir los que usted desee).

A partir de una secuencia de comandos shell, utilice la bandera prueba -t aplica al descriptor de fichero 0 (entrada estándar).

Ejemplos:

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

# Modern interactive shells: ksh, bash, zsh
[[ -t 0 ]] && echo This is a terminal
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top