cronを介してbashスクリプトを実行しようとしていますが、実行の開始時に次のエラーが発生します。
tput: No value for $TERM and no -T specified
これが私のcrontabの内容です。
0 8 * * 1-5 cd /var/www/inv/ && /var/www/inv/unitTest run all 2>&1| mail -r "[email protected]" -s "Daily Inventory Unit Test Results" [email protected]
答え1
単体テストスクリプトを呼び出して、tput
どのテストが合格して失敗したかを示す素晴らしい出力を生成できます。cron
端末がないため端末タイプ($TERM
)がないのでtput
、存在しない端末を制御する方法がありません。
単体テストスクリプトには2つのモードが必要です。
- 端末で実行:
tput
良い出力を生成するために呼び出すことができます。 - 端末で実行しないでください。呼び出すべきではありません
tput
が、代わりにここで行ったように電子メールで配信するのに適したプレーンテキスト出力形式を生成します。
単体テストが端末で実行されていることを確認する最も簡単な方法は、端末を参照するstdioファイル記述子をテストすることです。シェルスクリプトの場合は、次のようにします。
if [ -t 1 ]; then
tput bold; echo pretty; tput sgr0
else
echo ugly
fi
デフォルトでは、端末で実行されていない限り呼び出さないでくださいtput
。これにより、どのモードで実行してもエラーを防ぎ、合理的な出力を生成できます。
答え2
上記のCeladaが提供した回答を拡張します(まだ他の回答にコメントできるほど評判スコアが高くないため、コメントの代わりに回答を投稿する必要があります。)...
提案によるとTLDP.org[ -t 0 ]
、ローカル端末で作業できますが、SSH経由でリモートで呼び出すと失敗します。
したがって、ソケットがあることも確認する必要があります。以下は、端末またはソケットを確認する例です。
if [[ -t 0 || -p /dev/stdin ]]
then
echo interactive
else
echo non-interactive
fi