In Linux, wie kann ich testen, ob die Ausgabe eines Programms zu einem Live-Terminal wird oder in eine Datei?

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

Frage

Wenn Sie git scheint es magisch zu wissen, ob die Standardausgabe wird durch ein Rohr oder in eine Datei vs, wenn er an der Konsole angezeigt wird. Zum Beispiel, wenn Sie Farben aktiviert haben und Sie tun

git status

wird die Ausgabe für verschiedene Kategorien von Dateien werden aufgelistet kolorieren. Wenn Sie jedoch tun

git status | less

oder

git status > status.txt

es entfernt die Linux Farbe Formatierung und Sie siehe Ebene, ungefärbt Text.

Wie git erkennen, ob die Ausgabe der Befehle Datei wird zum Terminal vs gehen?

War es hilfreich?

Lösung

isatty(int fd) wird prüfen, ob der fd an einen Terminal oder etwas anderes verweist. Es ist ein Teil von unistd.h in dem 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 täuschen zu denken, dass Ihr Programm ist ein Mensch, es ist ein Weg, das zu tun. Sie können eine Pseudo-Terminal (pty). Diese Technik wird verwendet von zu erwarten , zum Beispiel.

Andere Tipps

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

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.

kann bestätigen, dass das, was git beruht 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).

Ausführen gegen die git-Source-Tree.

Beachten Sie, dass fds 0 = stdin, 1 = stdout, 2 = stderr standardmäßig, aber diese kann natürlich umgelenkten oder geschlossen werden (in der Regel, wenn Sie ein Daemon sind Sie schließen Ihre Datei-Deskriptoren und wieder öffnen, die, die Sie will).

Von einem Shell-Skript, verwenden Sie den -t Test-Flag an den Dateideskriptor angewandt 0 (Standardeingabe).

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top