Подтвердить что ты не робот

Обнаружение типа выходного потока оболочки 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, если ваш выход перенаправляется или перенаправляется?

4b9b3361

Ответ 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; единственное, что вы можете сделать, это предоставить коммутатор, который позволяет подавлять управляющие символы на выходе.