Обнаружение типа выходного потока оболочки script
Я пишу оболочку script, которая использует символы символов ANSI в командной строке.
Пример: example.sh
#!/bin/tcsh
printf "\033[31m Success Color is awesome!\033[0m"
Моя проблема в том, чтобы делать:
$ ./example.sh > out
или
$./example.sh | grep
Коды ASCII будут отправлены вместе с текстом, сбрасывая вывод и просто вызывая хаос.
Мне интересно узнать, есть ли способ обнаружить это, чтобы я мог отключить цвет для этого особого случая.
Я искал несколько страниц и веб-страницы tcsh некоторое время и пока не нашел ничего, что было бы похоже на оболочку.
Я не привязан к tcsh, это наш стандарт группы... но кому это нужно?
Можно ли обнаружить внутри оболочки script, если ваш выход перенаправляется или перенаправляется?
Ответы
Ответ 1
Смотрите этот предыдущий вопрос SO, который охватывает bash. Tcsh предоставляет те же функции с filetest -t 1
, чтобы увидеть, является ли стандартный вывод терминалом. Если это так, напечатайте цветные материалы, иначе оставьте это. Здесь tcsh:
#!/bin/tcsh
if ( -t 1 ) then
printf "\033[31m Success Color is awesome!\033[0m"
else
printf "Plain Text is awesome!"
endif
Ответ 2
Внутри оболочки bourne script (sh, bask, ksh,...) вы можете подать стандартный вывод в программу tty
(стандартная в Unix), которая сообщает вам, является ли ее вход tty или нет, используя флаг -s
.
Поместите следующее в "check-tty":
#! /bin/sh
if tty -s <&1; then
echo "Output is a tty"
else
echo "Output is not a tty"
fi
И попробуйте:
% ./check-tty
Output is a tty
% ./check-tty | cat
Output is not a tty
Я не использую tcsh
, но должен быть способ перенаправить стандартный вывод на стандартный вход tty
. Если нет, используйте
sh -c "tty -s <&1"
в качестве тестовой команды в tcsh
script, проверьте ее статус выхода, и все готово.
Ответ 3
Обнаружение типа выходного потока рассматривается в вопросе определить, запущена ли оболочка script через канал.
Решив, что вы разговариваете с терминалом, вы можете использовать tput
для получения правильных кодов эвакуации для конкретного терминала, который вы используете, - это сделает код более переносимым.
Пример script (в bash
Я боюсь, поскольку tcsh
не мой сингл) приведен ниже.
#!/bin/bash
fg_red=
fg_green=
fg_yellow=
fg_blue=
fg_magenta=
fg_cyan=
fg_white=
bold=
reverse=
attr_end=
if [ -t 1 ]; then
fg_red=$(tput setaf 1)
fg_green=$(tput setaf 2)
fg_yellow=$(tput setaf 3)
fg_blue=$(tput setaf 4)
fg_magenta=$(tput setaf 5)
fg_cyan=$(tput setaf 6)
fg_white=$(tput setaf 7)
bold=$(tput bold)
reverse=$(tput rev)
underline=$(tput smul)
attr_end=$(tput sgr0)
fi
echo "This is ${fg_red}red${attr_end}"
echo "This is ${fg_green}green${attr_end}"
echo "This is ${fg_yellow}yellow${attr_end}"
echo "This is ${fg_blue}blue${attr_end}"
echo "This is ${fg_magenta}magenta${attr_end}"
echo "This is ${fg_cyan}cyan${attr_end}"
echo "This is ${fg_white}white${attr_end}"
echo "This is ${bold}bold${attr_end}"
echo "This is ${reverse}reverse${attr_end}"
echo "This is ${underline}underline${attr_end}"
Для получения дополнительной информации см. "man tput
" и "man terminfo
" - для воспроизведения есть всевозможные escape-коды.
Ответ 4
Насколько я знаю, нет способа определить конечный пункт назначения вывода вашей оболочки script; единственное, что вы можете сделать, это предоставить коммутатор, который позволяет подавлять управляющие символы на выходе.