In Linux, wie kann ich testen, ob die Ausgabe eines Programms zu einem Live-Terminal wird oder in eine Datei?
-
22-09-2019 - |
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?
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