2016-01-01 7 views
5

Ich habe versucht, Farben zu einigen Zeichenfolgen hinzuzufügen, die in einem Terminal angezeigt werden müssen, das ansi-Escape-Code verwendet. Bis jetzt habe ich noch nicht die ganze Ascii-Escape-Code-Sache begriffen, ich habe nur versucht, durch Kopieren einige Escape-Codes einzufügen. Dann sah das answer, die gebeten, zu überprüfen, ob das Programm überprüfen sollte, ob es in einem Terminal ausgeführt wird, oder sonst fortfahren, ohne Zeichenketten mit Escape-Codes zu verschmutzen?Sicherstellen, dass Programm in einem Terminal ist

Antwort erklärt ein * nichts-basierte Funktion isatty() zu verwenden, die ich, liegen in unistd.h fand heraus, was wiederum nicht auf meinem Verständnis zu cunistd von CPP Standard gefördert wurde, dass es nicht in c Standard zunächst place.I war versuchte wieder SO zu suchen, konnte aber nicht gut verstehen. Jetzt habe ich zwei Fragen dazu:

  • In welcher Umgebung (richtiges Wort?) Kann ein Programm - mit ascii Escape-Codes, ausgeführt werden, dass es eine erste Überprüfung erfordert? da ich nur für CLI bulding bin.
  • Was wäre eine angemessene Lösung nach ISO cpp-Standards für die Behandlung dieses Problems? mit unistd.h? Würde das den modernen CPP-Praktiken vorbehalten bleiben?
  • Gibt es auch etwas, das ich lesen/verstehen sollte, bevor ich mich mit ansi/colors in Verbindung setze?

    +0

    'Verwenden unistd.h' ist ein POSIX-Header, der an den C und C++ Standards vollständig orthogonal ist. Ich glaube nicht, dass einer dieser Standards irgendeine Vorstellung von einem Terminal hat, so dass Sie keine andere Wahl haben, als sich auf System-APIs für systemspezifische Funktionen zu verlassen. – melak47

    +0

    In Verbindung stehend: http://stackoverflow.com/questions/15331566/c-include-unistd-h-why-not-cunistd. –

    Antwort

    4

    Auf einem POSIX-System (wie Linux oder OSX) ist die isatty-Funktion in der Tat die richtige Funktion, um festzustellen, ob Sie an ein Terminal ausgeben oder nicht.

    als diese

    if (isatty(STDOUT_FILENO)) 
    { 
        // Output using VT100 control codes 
    } 
    else 
    { 
        // Output is not a TTY, could be a pipe or redirected to a file 
        // Use normal output without control codes 
    } 
    
    +0

    pipes & redirects == bash's '|' und '>'? und was ist VT100? Mein Wissen ist begrenzt auf tty, pty, shells und gui-terminals :( –

    +2

    Sie sollten die termcap-Bibliothek verwenden, um Escape-Sequenzen zu erhalten, anstatt die Sequenzen für ein bestimmtes Terminal zu kodieren. Aber alle modernen Terminalemulatoren verwenden Sequenzen basierend auf VT100 Terminal aus den 70er Jahren .. – Barmar

    +0

    @AbhinavGauniyal [Wikipedia ist dein Freund] (https://en.wikipedia.org/wiki/VT100) :) –

    Verwandte Themen