LINUX.ORG.RU

Как определить что вывод был перенаправлен?

 , , ,


1

1

Допустим программа делает

appname 
-hello
fprintf(stdout,"\x1B[31m""-hello""\x1B[39m");

Но если

appname > out.txt

она будет делать

fprintf(stdout,"hello");

Можно ли как то определить что stdout был перенаправлен?

static bool _is_console(FILE * stream) {
    int fd = fileno(stream);
#if defined(BXI_OS_GLX) // Is linux, подставь из своего компиля
    return isatty(fd);
#else
    HANDLE handle = (HANDLE) _get_osfhandle(fd);
    DWORD mode;
    return GetConsoleMode(handle, &mode);
#endif
}
PPP328 ★★★★★
()
Ответ на: комментарий от PPP328

Спасибо больше. За код для оффтопика отдельное спасибо. Так бы я даже не подумал выяснять как там это делать. Но теперь добавлю.

LINUX-ORG-RU ★★★★★
() автор топика
Ответ на: комментарий от Legioner

Ну это уже когда из скриптов, но всё равно спасибо за наводку.

LINUX-ORG-RU ★★★★★
() автор топика

Какой ужас. С архитектурной точки зрения stdout это абстракция и ты не должен делать попытки узнать, что за ней. Похоже ты лепишь костыли.

Астанавитесь!

ox55ff ★★★★★
()
Ответ на: комментарий от ox55ff

stdout это абстракция и ты не должен делать попытки узнать, что за ней. Похоже ты лепишь костыли

Представь себе, почти все утилиты так делают. Никогда не обращал внимания, что при перенаправлении в файл твои любимые утилиты пишут без цвета, а в консоль - с цветом? Скажу больше, даже в libc чекает, чем является stdout, поэтому когда твоя программка принтует в консоль, сискол write дёргается на каждый \n, а при записи в файл - когда буфер заполнится

alex-pat
()
Ответ на: комментарий от alex-pat

программка принтует в консоль, сискол write дёргается на каждый \n, а при записи в файл - когда буфер заполнится

можно попросить libc чтобы всегда сискол дёргался лишь когда буфер заполнится…

https://en.cppreference.com/w/c/io/setvbuf

fsb4000 ★★★★★
()
Ответ на: комментарий от ox55ff

Сравни фото в цвете https://i.ibb.co/ZxpKsFx/2021-10-04-17-36-17.png

и сохранение в файл с учётом перенаправления

[1][Test Assertion true]
[ASSERTION_TRUE_TEST]
[PASSED>>>>][time wasted 1466 ns]
[EXPRESSION][5+5+6+5+5]
[RETURNED>>][26]
------------
[2][Test Assertion true]
[ASSERTION_FALSE_TEST]
[FAILED>>>>][time wasted 978 ns]
[EXPRESSION][5+5+6+5+5]
[RETURNED>>][26]
------------
[3][Test Assertion false]
[ASSERTION_FALSE_TEST]
[FAILED>>>>][time wasted 978 ns]
[EXPRESSION][5+5+6+5+5]
[RETURNED>>][26]
------------
[ASSERTION_COMPARE_UINT_TEST]
[PASSED>>>>][time wasted 1466 ns]
[EXPRESSION][1]
[RETURNED>>][1]
[EXPECTED>>][1]
------------
[ASSERTION_COMPARE_SINT_TEST]
[FAILED>>>>][time wasted 978 ns]
[EXPRESSION][0]
[RETURNED>>][0]
[EXPECTED>>][1]

и это, без учёта

[35m[[39m1[35m][39m[35m[[39m[36mTest Assertion true[39m[35m][39m
[35m[[39m[32mASSERTION_TRUE_TEST[39m[35m][39m
[35m[[39m[32mPASSED>>>>[39m[35m][39m[35m[[39mtime wasted 1466 ns[35m][39m
[35m[[39m[32mEXPRESSION[39m[35m][39m[35m[[39m[39m5+5+6+5+5[39m[35m][39m
[35m[[39m[32mRETURNED>>[39m[35m][39m[35m[[39m26[35m][39m
[33m------------[39m
[35m[[39m2[35m][39m[35m[[39m[36mTest Assertion true[39m[35m][39m
[35m[[39m[31mASSERTION_FALSE_TEST[39m[35m][39m
[35m[[39m[31mFAILED>>>>[39m[35m][39m[35m[[39mtime wasted 978 ns[35m][39m
[35m[[39m[31mEXPRESSION[39m[35m][39m[35m[[39m[39m5+5+6+5+5[39m[35m][39m
[35m[[39m[31mRETURNED>>[39m[35m][39m[35m[[39m26[35m][39m
[33m------------[39m
[35m[[39m3[35m][39m[35m[[39m[36mTest Assertion false[39m[35m][39m
[35m[[39m[31mASSERTION_FALSE_TEST[39m[35m][39m
[35m[[39m[31mFAILED>>>>[39m[35m][39m[35m[[39mtime wasted 1466 ns[35m][39m
[35m[[39m[31mEXPRESSION[39m[35m][39m[35m[[39m[39m5+5+6+5+5[39m[35m][39m
[35m[[39m[31mRETURNED>>[39m[35m][39m[35m[[39m26[35m][39m
[33m------------[39m
[35m[[39m[32mASSERTION_COMPARE_UINT_TEST[39m[35m][39m
[35m[[39m[32mPASSED>>>>[39m[35m][39m[35m[[39mtime wasted 1467 ns[35m][39m
[35m[[39m[32mEXPRESSION[39m[35m][39m[35m[[39m[39m1[39m[35m][39m
[35m[[39m[32mRETURNED>>[39m[35m][39m[35m[[39m1[35m][39m
[35m[[39m[32mEXPECTED>>[39m[35m][39m[35m[[39m1[35m][39m
[33m------------[39m
[35m[[39m[31mASSERTION_COMPARE_SINT_TEST[39m[35m][39m
[35m[[39m[31mFAILED>>>>[39m[35m][39m[35m[[39mtime wasted 978 ns[35m][39m
[35m[[39m[31mEXPRESSION[39m[35m][39m[35m[[39m[39m0[39m[35m][39m
[35m[[39m[31mRETURNED>>[39m[35m][39m[35m[[39m0[35m][39m
[35m[[39m[31mEXPECTED>>[39m[35m][39m[35m[[39m1[35m][39m
[33m------------[39m

LINUX-ORG-RU ★★★★★
() автор топика
Последнее исправление: LINUX-ORG-RU (всего исправлений: 1)
Ответ на: комментарий от alex-pat

Никогда не обращал внимания, что при перенаправлении в файл твои любимые утилиты пишут без цвета, а в консоль - с цветом?

Кстати, нарушение UNIX-way. Достаточно использовать ansi2txt, а не делать одно и то же в каждой утилите.

monk ★★★★★
()
Последнее исправление: monk (всего исправлений: 1)
Ответ на: комментарий от monk

Кстати, нарушение UNIX-way.

Да, в погоне за дружелюбностью к пользователю, которому иначе пришлось бы настраивать алиасы или конфиги для смены поведения по-умолчанию в терминале. По классике все должно быть черно-белый

Достаточно использовать ansi2txt, а не делать одно и то же в каждой утилите.

Это отвратительное решение, по крайней мере с точки зрения производительности

annulen ★★★★★
()
Ответ на: комментарий от annulen

точки зрения производительности

как обычно готовы пожертвовать архитектурой ради производительности… компы сейчас быстрые

anonymous
()
Ответ на: комментарий от anonymous

Если программа выводит десятки тысяч строк лога, то это вполне реальная проблема, а не просто перфекционизм

annulen ★★★★★
()
Ответ на: комментарий от annulen

Это отвратительное решение, по крайней мере с точки зрения производительности

Почему? pipe всё равно в памяти. ansi2txt работает в отдельном процессе от остальной программы.

Если это решение считать отвратительным, то вообще использование coreutils надо тоже считать таковым. И всё писать на Си. Как systemd.

monk ★★★★★
()
Ответ на: комментарий от monk

Программа сможет выводить строки быстрее, чем ansi2txt с них убирает ansi коды?

Маловероятно (хотя возмонжо), но отжор CPU на ansi2txt будет совсем не 0%, а проц может быть нужен для более полезных задач

annulen ★★★★★
()
Ответ на: комментарий от i-rinat

Кстати, философия UNIX про прагматичность, а не про догмы, поэтому нарушение отдельных принципов для упрощения системы - это нормально

annulen ★★★★★
()
Ответ на: комментарий от Legioner

Почему? И не в каждом, а только с цветным выводом. Пишем же в каждом фоновом пайпе nohup и &, а ведь тоже можно было как с –color сделать –service на все утилиты, чтобы они сами в фон уходили.

monk ★★★★★
()
Ответ на: комментарий от annulen

отжор CPU на ansi2txt будет совсем не 0%

Да какая разница, сколько он там процентов будет есть. Тут дело в том, что предлагается во всех скриптах теперь вместо ls и grep всегда писать ls | ansi2txt и grep | ansi2txt. Головная боль на ровном месте.

i-rinat ★★★★★
()
Ответ на: комментарий от annulen

Маловероятно (хотя возмонжо), но отжор CPU на ansi2txt будет совсем не 0%

С учётом того, что его использование всегда связано с записью в файл, очень маловероятно.

monk ★★★★★
()
Ответ на: комментарий от monk

а ведь тоже можно было как с –color сделать –service на все утилиты, чтобы они сами в фон уходили.

Нельзя, потому что трубопровод организуется оболочкой, а не самими утилитами.

i-rinat ★★★★★
()
Ответ на: комментарий от monk

Откуда ты знаешь какие с цветным, какие нет. Откуда ты знаешь, что завтра не выйдет новая версия с цветным. Потенциально каждая утилита может красить вывод. Не удивлюсь если в cat добавят подсветку синтаксиса.

Legioner ★★★★★
()
Последнее исправление: Legioner (всего исправлений: 1)
Ответ на: комментарий от annulen

Да, в погоне за дружелюбностью к пользователю, которому иначе пришлось бы настраивать алиасы или конфиги для смены поведения по-умолчанию в терминале.

С одной стороны обработка команд цвета усложнила бы код программ, но с другой стороны иногда хочется чтобы в конвеере из нескольких grep раскраска найденного была бы не только от последнего грепа.

anonymous
()
Ответ на: комментарий от i-rinat

Нельзя, потому что трубопровод организуется оболочкой, а не самими утилитами.

В смысле? nohup – всего лишь блокировка сигнала. Уход в фон тоже можно сделать через функцию daemon.

Кстати, сервер 1С так и работает ragent /daemon – в фоне, а просто ragent в консоли. Потому что с Windows пришёл, а там нормальной оболочки долго не было.

monk ★★★★★
()
Ответ на: комментарий от monk

В смысле?

Ты же сам писал про пайпы:

Пишем же в каждом фоновом пайпе

Если в пайпе много команд, то каждой дописывать опции для ухода в фон замучаешься. И опять получается слепое следование выдуманному идолу, которое кроме проблем ничего не даёт.

i-rinat ★★★★★
()
Последнее исправление: i-rinat (всего исправлений: 1)
Ответ на: комментарий от i-rinat

Тут дело в том, что предлагается во всех скриптах теперь вместо ls и grep всегда писать ls | ansi2txt и grep | ansi2txt. Головная боль на ровном месте.

Это можно было бы решить, изменив поведение шелла, но это тоже не юникс-вэйно.

annulen ★★★★★
()
Ответ на: комментарий от annulen

Это можно было бы решить, изменив поведение шелла, но это тоже не юникс-вэйно.

Тогда шелл должен знать, какие программы надо фильтровать.

monk ★★★★★
()
Ответ на: комментарий от monk

С учётом того, что его использование всегда связано с записью в файл, очень маловероятно.

Во-первых, перенаправляют не только в файлы, во-вторых, какое отношение отжор CPU имеет к факту записи в файл?

annulen ★★★★★
()
Ответ на: комментарий от monk

Все, разумеется, точно так же как и юзер не будет ломать голову, где ему втыкать ansi2txt, а где не надо. Можно модом сделать, включаемым через set например

annulen ★★★★★
()
Ответ на: комментарий от annulen

Если я ничего не путаю юникс вей это расчётливый и прагматичный подход. Точка. Именно из этого вытекает. Файл как интерфейс ко всему зачем переизобредать механизмы коммуникации? Разделение утилит по задачам ведь простые программы быстрее работают и проще их создавать, а также поддерживать. И так далее. Последние пункты это следствия прагматичного подхода, а не догмы. Догма это искать пути наиболее простых,удобных,универсальных решений, которые легко поддерживать и создавать. Если следовать псевдоуниксвею то у утилит не должно быть возможности писать куда то, они должно всегда выводить на стандартный вывод, а для записи есть > и >>. Программа выводит текст и делает это хорошо, она может выводить его как на экран так и в файл так и в память результат всегда должен быть один. Всё выше это имхо. Должен быть по моему во главе здравый смысл, а не просто следование правилам, которые хоть и красивые, но сова и глобус не всегда друзья. Вот если бы разбор формата цветовой выдачи был бы как HTML то прагматичнее было бы да использовать отдельную утилиту, так как есть разница между просто не выводить немножко лишних символов и парсить DOM с тысячами состояний и прочим.

хотя так как эскейп последовательности терминальная херня он сам в фундаменте должен уметь обрабатывать включая фильтрафию оных. Было бы app ~> например где ~ это убрать все последовательности, а без ~ печатать как есть или типа того как стандарт и всем было бы хорошо.

LINUX-ORG-RU ★★★★★
() автор топика
Последнее исправление: LINUX-ORG-RU (всего исправлений: 1)
Ответ на: комментарий от ox55ff

Какой ужас. С архитектурной точки зрения stdout это абстракция и ты не должен делать попытки узнать, что за ней

Если разраб рассчитывает что у системы есть POSIX.1-2001, то подразумевается что за stdio находятся дескрипторы.

Хуже того, в дефолтном оффтопике у которого вместо POSIX какой-то огрызок даже (!) есть fileno()

reprimand ★★★★★
()
Ответ на: комментарий от annulen

Все, разумеется

gzip или mencoder, боюсь, после обработки ansi2txt не распакуется.

monk ★★★★★
()
Ответ на: комментарий от reprimand

Хуже того, в дефолтном оффтопике у которого вместо POSIX какой-то огрызок даже (!) есть fileno()

Понятие о дескрипторах появилось еще до posix, а вот последний добавил туда pipe. А проблема у них в том, что их нельзя seek.

vodz ★★★★★
()
Ответ на: комментарий от beastie

А у тебя аватарка разноцветная. И вообще ЭМВ для людей, а не для ЭВМ. А ты уже сам давным давно Apple бой со всеми свистопердульками =) Внутреннее представление форматирования текста пользователя заботить не должно, для него важны лишь символы и везде это должны быть просто символы и точка. А вот цветовые различия в тексте это тоже самое что сам текст в интерфейсах и названия клавиш клавиатуры. Человек оперирует не только искуственным языком на основе выдуманных закорючек и палочек, а ещё и множеством других включая контекстно ассоциативный язык часть из которого это цветовая идентификация информации в явном или нет смысле. Текст форма описания информации, цвет форма разделения констекстов информации и её классификация. Единственный тут минус это ужасный формат эскейпов этих.

И вообще бисти, ты давныыым даывнооо был добрым ламповым Ъ дядькой, а потом тебя как подменили… хнык. Чё ты как дед стал, ваще ниваще. Вернее не дед, а наоборот. Хрен тебя поймёшь короче.

LINUX-ORG-RU ★★★★★
() автор топика
Последнее исправление: LINUX-ORG-RU (всего исправлений: 3)
Ответ на: комментарий от WitcherGeralt

Ламерок это я. А он фанатик =), ака бьюти блогер программист, когда всё по трендам и моде с «лучшими практиками».

LINUX-ORG-RU ★★★★★
() автор топика
Последнее исправление: LINUX-ORG-RU (всего исправлений: 1)
Ответ на: комментарий от LINUX-ORG-RU

Только вот мир на ANSI-совместимых терминалах клином не сошёлся. И все эти захардкоженые esc-последовальнести просто боль. Не надо так делать. Совсем. Из опыта говорю. Текст – это текст. Не мучайте его.

Я могу долго петь, как любой лог с этой цветорастией превращается в нечитабельную тыкву. Но думаю, что я не один тут такой.

Это всё хи-хи и весело, пока оно до дела не доходит.

beastie ★★★★★
()
Последнее исправление: beastie (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.