2009-05-26 3 views
14

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

Пример: example.sh

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

Моя проблема при выполнении:

$ ./example.sh > out 

или

$./example.sh | grep 

ASCII-коды будут разосланы сырыми вместе с текст, удаляющий выход и просто вызывающий хаос.

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

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

Я не привязан к tcsh, это наша группа стандартов ... но кому это нужно?

Возможно ли обнаружить внутри скрипта оболочки, если ваш выход перенаправляется или передается по трубопроводу?

+1

Мы * просто * сделали это: http://stackoverflow.com/questions/911168/detect-if-shell-script-is-running-through-a-pipe – dmckee

+0

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

+0

Связанный с этим: http://unix.stackexchange.com/q/9957/50602 – Palec

ответ

13

См. Это previous SO question, который охватывает 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 
+0

csh - не мой родной язык. извините за начальную ошибку – dwc

-2

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

6

Внутри сценария оболочки bourne (sh, bask, ksh, ...) вы можете подать стандартный вывод в программу tty (стандарт в Unix), которая сообщает вам, является ли ее вход tty или нет, используя флаг -s.

Поместите следующее в "чек-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 сценария, проверить его статус выхода, и вы сделали.

+0

sh -c "tty -s <& 1" всегда будет возвращать не tty при вызове из другого скрипта. Отличный ответ. –

+0

Нет, это не будет (и я только что протестировал его). –

3

Обнаружение типа выходного потока рассматривается в вопросе detect if shell script is running through a pipe.

Подумав, что вы разговариваете с терминалом, вы можете использовать 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» - есть все виды аварийных кодов, чтобы играть с.

Смежные вопросы