Wie kann ich in Linux testen, ob die Ausgabe eines Programms zu einem Live-Terminal oder zu einer Datei geht?

8

Wenn Sie git verwenden, scheint es auf magische Art und Weise zu wissen, ob Standard out durch eine Pipe geht oder in eine Datei vs, wenn es auf der Konsole angezeigt wird. Zum Beispiel, wenn Sie Farben aktiviert haben und Sie tun

%Vor%

wird die Ausgabe für verschiedene Kategorien von Dateien farbig darstellen. Allerdings, wenn Sie

tun %Vor%

oder

%Vor%

Es entfernt die Linux-Farbformatierung und Sie sehen nur einfachen, ungefärbten Text .

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

    
Ross Rogers 26.01.2010, 21:31
quelle

4 Antworten

14

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

Man-Seite: Ссылка

Ganz nebenbei: Wenn Sie von einem Programm lesen möchten, das ein anderes Programm verwendet, aber Sie möchten isatty dazu bringen, zu denken, dass Ihr Programm ein Mensch ist, dann gibt es einen Weg, dies zu tun. Sie können ein Pseudo-Terminal (pty) verwenden. Diese Technik wird beispielsweise von expect verwendet.

    
rescdsk 26.01.2010, 21:34
quelle
8

Dies ist ein C-Code, um zu demonstrieren, wie erkannt wird, wenn die Standardausgabe umgeleitet wird:

%Vor%

So weiß git, ob die Ausgabe zum Terminal oder zu einer Datei geht.

    
t0mm13b 26.01.2010 21:38
quelle
3

Kann bestätigen, dass git davon abhängt:

%Vor%

Läuft gegen den Quellcode-Baum.

Beachten Sie, dass fds 0 = stdin, 1 = stdout, 2 = stderr standardmäßig ist, aber diese können natürlich umgeleitet oder geschlossen werden (normalerweise schließen Sie Ihre Dateideskriptoren, wenn Sie ein Daemon sind, und öffnen die anderen wieder) will).

    
user257111 26.01.2010 21:40
quelle
2

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

Beispiele:

%Vor%     
dolmen 20.05.2013 20:04
quelle