Тадам! Сегодня научимся определять, отправляется ли стандартный вывод скрипта в терминал либо передается с помощью pipe в другой скрипт/утилиту. Чтобы стало понятнее, нужно читать дальше.
Есть у меня некий Bash скрипт, пусть будет таким:
Если его выполнить, то на экран выведется ожидаемый результат. Но что если я хочу добавить логику в этот скрипт, которая будет детектить pipe и отдавать другой ожидаемый результат?
Давай по порядку, смотри:
Этот скрипт выведет строку Hello Bashdays Welcome, где слово Bashdays будет жирным (bold).
Дальше я хочу, чтобы при использовании pipe, слово BashDays НЕ выделялось жирным. То есть если запустить скрипт самостоятельно, без использования пайпов, то текст будет жирным. Если скрипт запущен через пайп, то текст остается нормальный.
Пригодится например, чтобы не передавать утилитам всякие ненужные управляющие символы, а на экран выводить опрятную и ухоженную девочку. Про управляющие символы можешь почитать в этом посте 👇👇👇
Давай изобретать
В POSIX оболочках существует флаг -t, с помощью которого можно задетектить файловый дескриптор. Если файловый дескриптор fd = True, то скрипт запущен самостоятельно в терминале. Дескриптор fd может принимать значения:
0 - стандартный ввод
1 - стандартный вывод
2 - стандартная ошибка
Что такое POSIX я рассказывал в этом посте 👇👇👇
Пишем скрипт с логикой:
Запускаем:
Видим сработал детект. Скрипт самостоятельно определил, как он был запущен и вывел на экран, то что требуется.
➕ Подпишись на BashDays в телеграм
Флаг -t справедлив не только для Bash, он будет работать во всех POSIX оболочках.
Вот такие вот интересные кейсы порой приходится решать, благо всё это давно придумано за нас, главное знать про это. Ну теперь и ты про это знаешь.
Хорошего дня, увидимся!