2016-01-01 4 views
5

Я пытался добавить цвета к некоторым строкам, которые должны отображаться в терминале, используя код выхода ansi. До сих пор я не понимал, что все ascii вытесняет код, просто попробуйте, скопировав некоторые escape-коды. Затем увидел этот answer, который попросил проверить, что программа должна проверить, что он выполняется в терминале, или продолжать без загрязняющих строк с помощью escape-кодов?Убедитесь, что программа находится в терминале

Ответ объясняет использовать * NIX функция isatty() на основе которой я узнал, проживает в unistd.h, который, в свою очередь, не был повышен до cunistd стандартом CPP основаны на моем понимании, что это не в стандарте языка C на первый place.I попытался снова найти SO, но не смог хорошо понять. Теперь у меня есть два вопроса по этому вопросу:

  • В какой среде (правильном слове?) Может ли программа, используя escape-коды ascii, выполнить, чтобы она требовала первоначальной проверки? так как я только для cli.
  • Что было бы правильным решением в соответствии со стандартами ISO cpp для решения этой проблемы? используя unistd.h? будет ли это использование ограничиваться современной практикой cpp?

Также есть что-нибудь, что я должен прочитать/понять, прежде чем иметь дело с ansi/colors related thing?

+0

'unistd.h' является POSIX заголовок, который целиком и полностью ортогонален С и стандартами C++. Я не думаю, что любой из этих стандартов имеет какое-либо понятие о терминале, поэтому у вас мало выбора, кроме как зависеть от системных API для системных функций. – melak47

+0

Связанный: http://stackoverflow.com/questions/15331566/c-include-unistd-h-why-not-cunistd. –

ответ

4

В системе POSIX (например, Linux или OSX) функция isatty действительно является правильной функцией, чтобы определить, выводится ли вы на терминал или нет.

Используйте его как это

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

pipe & redirects == bash '' '' и '>'? и что такое VT100? мои знания ограничены tty, pty, оболочками и gui-терминалами :( –

+2

Вы должны использовать библиотеку termcap для получения escape-последовательностей, а не жесткого кодирования последовательностей для конкретного терминала. Но все современные эмуляторы терминалов используют последовательности на основе VT100 терминал из 70-х годов. – Barmar

+0

@AbhinavGauniyal [Википедия - ваш друг] (https://en.wikipedia.org/wiki/VT100) :) –