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


23

私のBashプロンプトは現在、次のシーケンスを使用してxtermタイトルバーを設定しています。

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

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

回答:


16

基本的に、次のものが必要です。

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

あなた.bashrcまたは類似の終わりに。これを解決するためにしばらく時間がかかりました-詳細については、私の答えを参照してください:)


このソリューションのサイモンをありがとう!ただし、.bashrcシェルの各コマンドの後にこれを追加すると、この出力が表示されます0;%s@%s:%s" "${USER}" "${HOSTNAME%%.*}" "${PWD/#$HOME/~}。trapコマンドをPS1?に割り当てることで、この出力を抑制できると思います。ただし、PS1=trap 'echo -ne "\033]0;$BASH_COMMAND\007"' DEBUG機能しません。エラーにつながりますbash: echo -ne "\033]0;$BASH_COMMAND\007": command not found
orschiro

ところで、私はstackoverflow.com/questions/48407130/…を調査したところ、おそらくこのアドバイスが適用された結果として尋ねられました。トラップは、stdoutではなく、stderrまたはTTYに直接書き込む必要があります。
チャールズダフィー

1
@orschiro、このtrapコマンドをPS1に割り当てるのではなく、別のコマンドとして実行することをお勧めします。
チャールズダフィー

12

このSUの回答に触発された)

いくつかの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トラップを伝播します。そうでない場合、タイトルバーは変更されません


ハ!まったく同時に同じ答え!サブシェルを処理するための+1ですが、パイプの問題に対する答えはありますか?(SO質問への私のリンクを参照)
サイモン

うまくいかないssh
アビス7

また、「タブ」の完了を「殺す」
abyss.7

ところで、私はstackoverflow.com/questions/48407130/…を調査したところ、おそらくこのアドバイスが適用された結果として尋ねられました。トラップは、stdoutではなく、stderrまたはTTYに直接書き込む必要があります。
チャールズダフィー

/dev/ttystderrの代わりにリダイレクトする方が良いと思いませんか?
アーロンディグラ

2

私はさまざまな投稿から自分のソリューションを回避しました。これにより、ユーザー、ホスト名、pwd、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\]"

history 1およびtrapを使用して、現在のコマンドを追加します。

# 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

必要に応じて自由に採用してください。


ところで、私はstackoverflow.com/questions/48407130/…を調査したところ、おそらくこのアドバイスが適用された結果として尋ねられました。トラップは、stdoutではなく、stderrまたはTTYに直接書き込む必要があります。
チャールズダフィー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.