linux + tput:$ TERMに値がなく、-Tが指定されていません。

linux + tput:$ TERMに値がなく、-Tが指定されていません。

bashスクリプトでtputコマンドを使用してテキストの色を指定しています。

〜のように

tput setaf 2

パテナコンソールでスクリプトを実行すると、すべてがうまく機能します。

ただし、SSHを介してスクリプトを実行するいくつかの外部WINアプリケーションエンジンを実行すると、tputで次のエラーが発生します。

tput: No value for $TERM and no -T specified
tput: No value for $TERM and no -T specified
tput: No value for $TERM and no -T specified
tput: No value for $TERM and no -T specified

tputコマンドを使用するためにbashスクリプトで設定する必要があるもの(ENVなど)を提案してください。

答え1

接続時にssh環境変数がリモートアプリケーションに渡されたり、渡されたりしない場合があります。また「WINアプリケーションエンジン」TERM設定がまったくない可能性があります。

その場合(またはその問題TERMについて)同じ効果があります。puttyxterm

tput setaf 2
tput -T putty setaf 2

使用する制御順序がsetaf同じであるためです。繰り返しますが、これらはTERM次のlinuxとおりです。

tput setaf 2
tput -T linux setaf 2

setaf前景(テキスト)を特定の値に設定するために使用されます。米国国立標準協会(x3.64) エスケープシーケンス。あなたが使用しているほとんどの端末はこれを行います。あるいは、一部はこれらのエスケープシーケンスを認識しない。言及されたアプリケーションがないので、実験を通してこれが機能していることを確認する必要があります。「WINアプリケーションエンジン」対応するエスケープシーケンスを識別します。その場合、同じ内容を使用できます。米国国立標準協会脱出してできます。

tput -T xterm setaf 2

(もちろん、パテ、Linux、xtermの間には異なる違いもあります。)

答え2

これにはいくつかの可能なオプションがあります。

  1. tput対話型端末セッションがない場合は使用しないでください。次のいずれかの方法を選択できます。

    [[ -t 1 ]] && tput setaf 2 ...          # Only set a colour if we have a tty
    
    [[ -n "$TERM" ]] && tput setaf 2 ...    # Only set a colour if we have a terminal type definition
    
  2. 仮想端末タイプを設定します。 /のほとんどの機能をexport TERM=dumb無効にできます。もちろん、まだ端末タイプを設定していない場合にのみこれを実行できます。terminfotermcap

    [[ -z "$TERM" ]] && export TERM=dumb    # Set a dummy terminal type if none set
    
    [[ ! -t 1 ]] && export TERM=dumb        # Set a dummy terminal type unless a tty
    

    このアプローチでは、後続のコードを変更する必要はなく、アプリケーションを実行する前に設定することも、違いを知る必要もありません。

答え3

tty コマンドを使用して、スクリプトが端末で実行されているかリモートで実行されているかを確認します。

if tty -s
then 
    # executed only if in a terminal
    tput setaf 2 
fi

SSH セッションでコマンドを指定した場合、thenおよび間のコマンドは実行されません。fi

答え4

これはtputの問題に対する私の解決策です。

# when $TERM is empty (non-interactive shell), then expand tput with '-T xterm-256color'
[[ ${TERM}=="" ]] && TPUTTERM='-T xterm-256color' \
                  || TPUTTERM=''

declare -r    RES='tput${TPUTTERM} sgr0'       REV='tput${TPUTTERM} rev'
declare -r    fRD='tput${TPUTTERM} setaf 1'    bRD='tput${TPUTTERM} setab 1'
declare -r    fGN='tput${TPUTTERM} setaf 2'    bGN='tput${TPUTTERM} setab 2'
...
echo ${fRD}" RED Message: ${REV} This message is RED REVERSE. "${RES}
echo ${fGN}" GREEN Message: ${REV} This message is GREEN REVERSE. "${RES}
...

これにより、対話型シェルか非対話型シェルかは重要ではありません。 tputはまだうまくいきます。

関連情報