2010-01-26 12 views
8

Wenn Sie git verwenden, scheint es magisch zu wissen, ob der Standard out durch eine Pipe oder in eine Datei läuft, während es auf der Konsole angezeigt wird. Zum Beispiel, wenn Sie Farben aktiviert haben und SieIn Linux, wie kann ich testen, ob die Ausgabe eines Programms zu einem Live-Terminal oder zu einer Datei geht?

tun, wird es die Ausgabe für verschiedene Kategorien von Dateien in der Liste eingefärbt werden. Wenn Sie jedoch

git status | less 

oder

git status > status.txt 

tun entfernt es die linux color formatting und Sie nur normalen, ungefärbt Text.

Wie erkennt git, ob die Ausgabe seiner Befehle zur Datei vs zum Terminal geht?

+3

Ich glaube nicht, dass dies auf Superuser sein sollte, da die OP wirklich sucht ist, wie das Programm heißt tut. git erkennt, wohin es umgeleitet wird oder nicht. – t0mm13b

+2

Ich stimme mit @ tommieb75 überein, es ist eine API-Frage, nicht eine Frage, wie kann ich Admin fragen. –

+0

Übrigens, wenn du nicht nur neugierig warst, und du das fragst, weil du * colored * und * paged output from git willst, kannst du mit 'git config' Einstellungen wie' core.pager' (weniger) herumspielen und 'color.pager' (wahr). http://www.kernel.org/pub/software/scm/git/docs/git-config.html – rescdsk

Antwort

14

isatty(int fd) wird überprüft, ob der fd verweist auf ein Terminal oder etwas anderes. Es ist Teil von unistd.h in der GNU C-Bibliothek.

Man Seite: http://linux.die.net/man/3/isatty

Als Nebenwirkung: Wenn Sie von einem Programm mit einem anderen Programm lesen mögen, aber Sie wollen isatty in täuschen zu denken, dass Ihr Programm ein Mensch ist, gibt es eine Möglichkeit, das zu tun . Sie können eine pseudo-terminal (pty) verwenden. Diese Technik wird beispielsweise von expect verwendet.

8

Dies ist ein C-Code zu zeigen, wie wenn die Standardausgabe umgeleitet wird, erkennen:

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

Das ist, wie git weiß, ob die Ausgabe an das Endgerät oder in eine Datei wird.

3

Kann das ist bestätigen, was git verlässt sich auf:

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

Run gegen den Baum git Quelle.

Beachten Sie, dass fds 0 = stdin, 1 = stdout, 2 = stderr standardmäßig, aber diese können natürlich umgeleitet oder geschlossen werden (normalerweise schließen Sie bei einem Daemon Ihre Dateideskriptoren und öffnen sie wieder) Sie wollen).

2

Verwenden Sie in einem Shell-Skript das Testflag -t, das auf den Dateideskriptor 0 (Standardeingabe) angewendet wurde.

Beispiele:

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

# Modern interactive shells: ksh, bash, zsh 
[[ -t 0 ]] && echo This is a terminal