TGViewer
Bash Days | Linux | DevOps Bash Days | Linux | DevOps @bashdays · 23.6K subscribers
Post #272 9.63K
Тадам! Сегодня научимся определять, отправляется ли стандартный вывод скрипта в терминал либо передается с помощью pipe в другой скрипт/утилиту. Чтобы стало понятнее, нужно читать дальше.

Есть у меня некий Bash скрипт, пусть будет таким:

echo "Hello Bashdays Welcome"


Если его выполнить, то на экран выведется ожидаемый результат. Но что если я хочу добавить логику в этот скрипт, которая будет детектить pipe и отдавать другой ожидаемый результат?

Давай по порядку, смотри:

bold=$(tput bold)
normal=$(tput sgr0)

echo "Hello ${bold}BashDays${normal} Welcome"


Этот скрипт выведет строку Hello Bashdays Welcome, где слово Bashdays будет жирным (bold).

Дальше я хочу, чтобы при использовании pipe, слово BashDays НЕ выделялось жирным. То есть если запустить скрипт самостоятельно, без использования пайпов, то текст будет жирным. Если скрипт запущен через пайп, то текст остается нормальный.

./script.sh
Hello Bashdays Welcome

./script.sh | cat
Hello Bashdays Welcome


Пригодится например, чтобы не передавать утилитам всякие ненужные управляющие символы, а на экран выводить опрятную и ухоженную девочку. Про управляющие символы можешь почитать в этом посте.

Давай мутить

В POSIX оболочках существует флаг -t, с помощью которого можно задетектить файловый дескриптор. Если файловый дескриптор fd = True, то скрипт запущен самостоятельно в терминале. Дескриптор fd может принимать значения:

0 - стандартный ввод
1 - стандартный вывод
2 - стандартная ошибка


Пишем скрипт с логикой:

bold=$(tput bold)
normal=$(tput sgr0)

if [ -t 1 ] ; then
echo "Hello ${bold}BashDays${normal} Welcome"
else.
echo "Hello BashDays Welcome"
fi


Запускаем:

./script.sh
Hello BashDays Welcome

./script | cat
Hello BashDays Welcome


Видим сработал детект. Скрипт самостоятельно определил, как он был запущен и вывел на экран, то что требуется.

Флаг -t справедлив не только для Bash, он будет работать во всех POSIX оболочках.

Вот такие вот интересные кейсы порой приходится решать, благо всё это давно придумано за нас, главное знать про эту срань. Ну теперь и ты про неё знаешь.

Хорошего дня, увидимся!

tags: #bash
—
💩 @bashdays
More from @bashdays
  1. Sep 30, 2026↗️ Для всех, кто строит 15 октября Cloud․ru соберет инженеров, которые строят и эксплуатир…
  2. Sep 29, 2026Самый жаркий холивар в команде — это не systemd, а какие заказать роллы на всю команду. Од…
  3. Sep 24, 2026Post #1565
  4. Sep 23, 2026Здрасти приехали, решил я в кой-то веке воспользоваться услугами Codex, создал аккаунт, по…
  5. Sep 22, 2026Всем привет, с вами TagdTagd. Сегодня опять поднимем тему архивов, но немного с другой сто…
  6. Sep 15, 2026Всем привет, с вами TagdTagd. И это вторая часть. Практическая. С первой частью можешь озн…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →