2010-01-26 38 views
8

Podczas korzystania z git wydaje się magicznie wiedzieć, czy standardowe wyjście przechodzi przez potok lub do pliku, a gdy jest wyświetlane na konsoli. Na przykład, jeśli kolory są włączone, a użytkownik będzie miał różne kolory na wyjściach dla różnych kategorii wyświetlanych plików, będzie to miało kolor. Jednakże, jeśli nieW systemie Linux, jak mogę sprawdzić, czy dane wyjściowe programu trafiają do terminalu na żywo lub do pliku?

git status | less 

lub

git status > status.txt 

usuwa linux color formatting i widzisz tylko zwykły tekst, bezbarwne.

W jaki sposób git wykrywa, czy wyjście z jego poleceń będzie zapisywać jako plik, czy przechodzić do terminala?

+3

Nie sądzę, że powinno to być na administratora, a PO jest naprawdę szukasz jest jak robi IE programu. git wykrywa, gdzie jest przekierowywany, czy nie. – t0mm13b

+2

Zgadzam się z @ tommieb75 jest to pytanie API, a nie jak admin pytanie. –

+0

Nawiasem mówiąc, jeśli nie byłeś po prostu ciekawy i pytałeś o to, ponieważ chciałeś mieć kolorowane * i * stronicowane wyjście z git, możesz zepsuć ustawienia 'git config' jak' core.pager' (mniej) i 'color.pager' (true). http://www.kernel.org/pub/software/scm/git/docs/git-config.html – rescdsk

Odpowiedz

14

isatty(int fd) sprawdzi, czy fd odnosi się do terminala, czy do czegoś innego. Jest częścią biblioteki unistd.h w bibliotece GNU C.

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

Tak na marginesie: jeśli chcesz czytać z programu za pomocą innego programu, ale chcesz oszukać isatty do myślenia, że ​​program jest człowiekiem, istnieje sposób, aby to zrobić . Możesz użyć pseudo-terminal (pty). Ta technika jest używana na przykład przez expect.

8

Jest to kod C do wykazania, jak wykrywać jeżeli standardowe wyjście jest przekierowywane:

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

To jak git wie, czy wyjście idzie do terminala lub do pliku.

3

może potwierdzić, że to, co opiera się na 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). 

biegną przeciwko drzewa źródłowego git.

Zauważ, że fds 0 = stdin, 1 = standardowe wyjście, 2 = stderr domyślnie, ale można je oczywiście przekierować lub zamknąć (zazwyczaj, jeśli jesteś demonem, zamkniesz deskryptory plików i ponownie je otworzysz chcesz).

2

Ze skryptu powłoki użyj flagi testu -t zastosowanej do deskryptora pliku 0 (standardowe wejście).

Przykłady:

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

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