Определение типа выходного потока сценария оболочки - PullRequest
14 голосов
/ 26 мая 2009

Я пишу сценарий оболочки, который использует символы цвета ANSI в командной строке.

Пример: example.sh

#!/bin/tcsh
printf "\033[31m Success Color is awesome!\033[0m"

Моя проблема заключается в следующем:

$ ./example.sh > out

или

$./example.sh | grep 

Коды ASCII будут отправляться в необработанном виде вместе с текстом, испортить вывод и, как правило, вызвать хаос.

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

Я какое-то время искал man-страницы tcsh и в Интернете и пока не смог найти что-то специфическое для оболочки.

Я не связан с tcsh, это стандарт нашей группы ... но кого это волнует?

Можно ли в сценарии оболочки обнаружить, перенаправлен ли ваш вывод или передан по каналу?

Ответы [ 4 ]

13 голосов
/ 26 мая 2009

См. предыдущий вопрос SO , который охватывает bash. Tcsh обеспечивает ту же функциональность с filetest -t 1, чтобы увидеть, является ли стандартный вывод терминалом. Если это так, то напечатайте цветной материал, иначе не используйте его. Вот тсш:

#!/bin/tcsh
if ( -t 1 ) then
        printf "\033[31m Success Color is awesome!\033[0m"
else
        printf "Plain Text is awesome!"
endif
6 голосов
/ 26 мая 2009

Внутри сценария оболочки Bourne (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, проверьте состояние выхода, и все готово.

3 голосов
/ 26 мая 2009

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

Решив, что вы разговариваете с терминалом, вы можете использовать tput для получения правильных кодов выхода для конкретного терминала, который вы используете - это сделает код более переносимым.

Пример сценария (в 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-кодов, с которыми можно играть.

0 голосов
/ 26 мая 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...