web-dev-qa-db-ja.com

スクリプト出力をファイルにリダイレクトするときにtputエスケープシーケンスを防止する

tputを使用してファイル名を色付けするシェル関数があります。

_color=$( tput setaf 1 )
normal=$( tput sgr0 )
colorize() {
    echo "${color}$1$(normal)"
}
_

関数を呼び出すと、端末は期待どおりに色付きのファイル名を表示します。

_$ myScript.sh .
/path/to/dir # (in color red)
_

次に、出力をファイルにリダイレクトすると、次のようになります。

_$ myScript.sh > /tmp/file.log
_

_file.log_には、次のようなエスケープシーケンスがまだ含まれています。

_^[[36m~/path/to/my/file/^[(B^[[[m
_

これは[〜#〜] term [〜#〜]およびinfocompと、端末がエスケープシーケンスをどのように解釈するかに関連している可能性がありますか?

アイデアは「非表示」端末をシミュレートすることですよね?

私のTERMは(Ubuntu 16.04)です:

_$ echo $TERM
xterm
_

スクリプトがファイルにリダイレクトされるときに、このようなtputエスケープシーケンスを防ぐにはどうすればよいですか?

回避策:lsまたはgrepのように_--color=none_のように、手動で色付けを無効にするオプションをスクリプトに追加します。

3
el-teedee

短い:tputはそれをしません。

より長い:あなたのスクリプトはそれを行うことができます

たとえば、標準出力が端末であるかどうかを確認します。

if [ -t 1 ]
then
    color=$( tput setaf 1 )
    normal=$( tput sgr0 )
else
    color=""
    normal=""
fi
4
Thomas Dickey