xterm タイトルバーにコマンドを表示

xterm タイトルバーにコマンドを表示

私のBashプロンプトは現在、次の順序でxtermタイトルバーを設定しています。

PS1='\033]0;\u@\h>\w\007'

タイトルバーに現在のコマンドを表示する簡単な方法はありますか?たとえば、末尾のファイルを使用している場合は、tail -f foo.logタイトルバーにを表示したいと思いますtail -f foo.log

答え1

デフォルトでは、以下が必要です。

trap 'printf "\033]0;%s\007" "${BASH_COMMAND//[^[:print:]]/}"' DEBUG

あなたの最後やそのようなもの.bashrc。それを調べるのに少し時間がかかりました。私の答えを確認してくださいここより多くの情報を知りたい場合:)

答え2

(からインスピレーションを受けるこれが答えです)

いくつかのbashトリックを組み合わせることができます:

  • DEBUG 信号が捕捉されると、各コマンドを実行する前にハンドラが呼び出されます。
  • この変数は$BASH_COMMAND現在実行中のコマンドを保持します。

したがって、DEBUGをキャプチャし、ハンドラにヘッダーを次のように設定させます$BASH_COMMAND

trap 'printf "\033]0;%s\007" "${BASH_COMMAND//[^[:print:]]/}" >&2' DEBUG

これは、他のものが変更されるまでタイトルを変更し続けますが、同じままである限り$PS1問題になりません。コマンドを起動すると、DEBUGハンドラはタイトルバーを変更し、コマンドが完了するとbashは新しいタイトルを描画します。メッセージを表示して再起動します。タイトルバーを設定します。

役に立つヒントを見つけましたここ(SU回答のソースでもある)には、以下が含まれます。

set -o functrace

これにより、bashはDEBUGトラップを開始するすべてのサブシェルに伝播します。それ以外の場合、タイトルバーは変更されません。

答え3

私はさまざまな投稿から自分のソリューションを思い出しました。これにより、ユーザー、ホスト名、パスワード、tty、および現在実行中のコマンド(bash用)を含むヘッダーが生成されます。

次のようになります(コマンドは実行されません)。

.:[user@hostname:/home/user][pts/10]:.

次のように(コマンド実行):

.:[user@hostname:/home/user][pts/10] {tail -F /var/log/syslog}:.

.bashrc どこかにPS1を拡張しました。

# set the terminals title. This is the "post-command" part,
# need to use a trap for pre-command (to add the command line to the title)
PS1+="\[\033]2;.:[\u@\h:\$PWD] [$(tty | cut -b 6-)]:.\007\]"

現在のコマンドを追加するには、次のようにします。歴史1そして:

# set a fancy title (this is pre-command, in PS1 is after-command (to reset command)
trap 'echo -ne "\033]2;.:[${USER}@${HOSTNAME}:${PWD}] [$(tty | cut -b 6-)] {$(history 1 | sed "s/^[ ]*[0-9]*[ ]*//g")}:.\007"' DEBUG

必要に応じて自由に調整してください。

関連情報