Können Unix[-ähnliche] Programme bestimmen, wohin ihre Ausgabe geht?

Können Unix[-ähnliche] Programme bestimmen, wohin ihre Ausgabe geht?

Bis vor kurzem war ich der Meinung, dass Unix-ähnliche Programme nicht wüssten, wohin ihre Ausgabe ging, sei es an die Standardausgabe, umgeleitet in eine Datei oder in eine Pipe. Eine nicht damit zusammenhängende U&L-Frage auf dieser Site machte mich jedoch auf das folgende Beispiel aufmerksam:

% echo "hello world" > file

% grep --color=auto lo file
hello world

% grep --color=auto lo file | cat
hello world

Offensichtlich kann man es hier nicht sehen, aber der erste Befehl zeigt wie erwartet „lo“ hervorgehoben an. Der zweite Aufruf, der durch eine Pipe geht, zeigt jedoch keine Farbe an. Dies deutet darauf hin, dass man sich grepbewusst war, dass seine Ausgabe an eine Pipe geleitet wird, und die Ausgabe von Farbe vermieden hat. Wie wird das gemacht?

Antwort1

Es ist möglich festzustellen, ob ein Dateideskriptor auf ein TTY verweist.

Kassedie isattyFunktion.

Alternativ können Siedie fstatFunktionDadurch erhalten Sie einen Teil der Informationen zur Datei.

Antwort2

Ja, das sind sie. Es gibt mehrere Methoden, um zu bestimmen, wohin die Ausgabe geht. Für eineVergleich: Siehe meine Antwort auf eine verwandte Frage auf Stackoverflow.

Antwort3

Ganz einfach. Es gibt verschiedene Möglichkeiten, um zu bestimmen, wohin die Ausgabe geht. In Python könnten Sie also so etwas tun wie

    /* CODE. Input will be parsed and executed */
int
PyRun_AnyFileExFlags(FILE *fp, const char *filename, int closeit,
                     PyCompilerFlags *flags)
       {
    if (filename == NULL)
        filename = "???";
    if (Py_FdIsInteractive(fp, filename)) {
        int err = PyRun_InteractiveLoopFlags(fp, filename, flags);

verwandte Informationen