2009-05-26 8 views
14

コマンドラインでANSIカラー文字を使用するシェルスクリプトを作成しています。シェルスクリプトの出力ストリームタイプを検出する

例:example.sh

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

やったときに私の問題は、次のとおりです。

$ ./example.sh > out 

または

$./example.sh | grep 

ASCIIコード

はと一緒に生送信されますテキスト、mucking出力、そしてちょうど一般的に混乱の原因。

これを検出する方法があるかどうか知りたいので、この特殊なケースでは色を無効にできます。

私は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の標準入力までです。ない場合は、お使いのtcshスクリプトでテストコマンドとして

sh -c "tty -s <&1" 

を使用し、その終了ステータスをチェックして、あなたは完了です。

+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」 - と遊ぶエスケープコードのすべての種類があります。

関連する問題