最近、KubuntuとLubuntu Linuxボックスを(apt-get dist-upgrade
で)アップグレードしました。今では毎回これらのマシンの1つにログインすると、次のメッセージが表示されます。
tput: No value for $TERM and no -T specified
正確なメッセージのスクリーンショットは次のとおりです。
これはLubuntuマシンとKubuntuマシンの両方で発生し、アップグレードするまで問題ありませんでした。そのため、ユーザーエラーではなかったと思われます。
どうすれば修正できますか?
UPDATE
これを.bashrcファイルまで追跡しました。このファイルは.profileファイルから呼び出されます。ただし、GUIログインを実行すると.bashrcファイルが実行されるのに対し、アップグレード前は実行されなかったという事実は少し奇妙です。いいえ、最近、.bashrcファイルまたは.profileを変更していません。また、bashは私のデフォルトのシェルではありません。
問題は、.bashrcファイルでtput
を呼び出して、プロンプトに色を追加する際に使用する変数を設定していることです。しかし、.bashrcファイルが実行される(不適切な)時点では、$TERM
は設定されていません。
fgRed=$(tput setaf 1) ; fgGreen=$(tput setaf 2) ; fgBlue=$(tput setaf 4)
fgMagenta=$(tput setaf 5) ; fgYellow=$(tput setaf 3) ; fgCyan=$(tput setaf 6)
fgWhite=$(tput setaf 7) ; fgBlack=$(tput setaf 0)
bgRed=$(tput setab 1) ; bgGreen=$(tput setab 2) ; bgBlue=$(tput setab 4)
bgMagenta=$(tput setab 5) ; bgYellow=$(tput setab 3) ; bgCyan=$(tput setab 6)
bgWhite=$(tput setab 7) ; bgBlack=$(tput setab 0)
更新された質問:どうすれば修正できますか? $TERM
を自分で設定する必要がありますか?または、$TERM
が設定されていない場合、これらの変数を設定しないでください。
更新2
私が試した解決策の1つは、$TERM
が設定されているかどうかを確認することでした。しかし、これはうまくいかないようでした。それでも同じエラーメッセージが表示されます。コードは次のとおりです。
if [ ! "$TERM" = "" ]; then
#Do stuff here
fi
したがって、明らかに$TERM
が設定されていたが、tput
はまだ設定されていないと結論付けた。
最終的には、シェルがインタラクティブシェルであるかどうかを確認することができました。 unix.stackexchangeのこの他の投稿に基づいてソリューションを作成しました: シェルがlogin/interactive/batchかどうかを確認する方法 。
したがって、ソリューションのコードは次のとおりです。
if [[ $- == *i* ]]; then
fgRed=$(tput setaf 1) ; fgGreen=$(tput setaf 2) ; fgBlue=$(tput setaf 4)
fgMagenta=$(tput setaf 5) ; fgYellow=$(tput setaf 3) ; fgCyan=$(tput setaf 6)
fgWhite=$(tput setaf 7) ; fgBlack=$(tput setaf 0)
bgRed=$(tput setab 1) ; bgGreen=$(tput setab 2) ; bgBlue=$(tput setab 4)
bgMagenta=$(tput setab 5) ; bgYellow=$(tput setab 3) ; bgCyan=$(tput setab 6)
bgWhite=$(tput setab 7) ; bgBlack=$(tput setab 0)
fi
これをするなら
if tty -s
then
: # your tput commands
fi
それはあなたの問題を解決します。 -sオプションを指定しないと、ttyはttyを表示するか、「not tty」と書き込みます。
私にとっては、追加
export TERM=xterm
問題を解決したのは/etc/profile
だけでした。実際、エラーはヒントを与えてくれました:No value for $TERM
[異なるシナリオですが、検索エンジンが最初にここに私を導きます]
「tput:$ TERMの値がなく、-Tが指定されていない」エラーがDockerコンテナーで発生した場合(私にとっては、 zsh Shellを開くときにdocker exec -it <container> zsh
(インタラクティブの場合は-i)を呼び出す)これを修正する唯一の方法は、このイメージのDockerfileでENV TERM xterm-256color
のような変数を設定することでした。
RUN export TERM=xterm-256color
やRUN echo "export TERM=xterm-256color" >> ~/.zshrc
などのアプローチは成功しませんでした。 TERMの他の値も可能です。
ターミナルを開いてみて(どれでもかまいません、tty1でもできます)、この行を実行してください
Sudo update-alternatives --config x-terminal-emulator
Xウィンドウ用のデフォルトのターミナルエミュレータを選択できます。番号を選択して1つを選択し、完了したら再起動します。
$ sudo update-alternatives --config x-terminal-emulator
代替x-terminal-emulatorには6つの選択肢があります(/ usr/bin/x-terminal-emulatorを提供)。
Selection Path Priority Status
------------------------------------------------------------
0 /usr/bin/gnome-terminal.wrapper 40 auto mode
1 /usr/bin/gnome-terminal.wrapper 40 manual mode
2 /usr/bin/koi8rxterm 20 manual mode
* 3 /usr/bin/lxterm 30 manual mode
4 /usr/bin/sakura 40 manual mode
5 /usr/bin/uxterm 20 manual mode
6 /usr/bin/xterm 20 manual mode
Press enter to keep the current choice[*], or type selection number:
エラーダイアログは bug#678421 の修正が原因であるため、私のせいです。 ;)構成ファイルの1つにあるコマンドによるエラーについて通知します。一番上までスクロールすると、エラーメッセージの原因となっているファイルを確認できます。
おそらく、Sergの答えは警告ダイアログを取り除くのに十分です。
編集:
更新された質問のために、いくつかのことを追加したいと思います。
以前とは異なり、/usr/sbin/lightdm-session
はbash(以前はsh)の下で実行されるようになりました。 ~/.profile
を調達すると、~/.profile
調達~/.bashrc
になります。おそらくこれは、~/.profile
のデフォルトの内容を変更する必要があることを意味します。
それを修正するためにできる最も簡単なことは、あなたが提案したように、$ TERMが設定されている場合にのみtputを呼び出すことです。