シェルスクリプトで現在の端末タブのタイトルを変更する

シェルスクリプトで現在の端末タブのタイトルを変更する

現在の端末タブのタイトルを変更する次のスクリプトが見つかりました。

#!/usr/bin/env bash
T=$1
ORIG=$PS1
TITLE="\e]2;$T\a"
PS1=${ORIG}${TITLE}
echo "Terminal tab title changed to $T"

端末に直接入力すると正常に動作します(例TITLE="\e]2;HELLO\a":)。

ただし、シェルスクリプト(rename.sh)では$ PS1が空で、スクリプトは機能しません。

rename.sh HELLOは出力されますが、"Terminal tab title changed to HELLO" 端末のタイトルは変更されません。 $PS1スクリプトは内部的に空です。

誰でも私がこれを理解するのを助けることができますか?

ベストアンサー1

xtermスクリプトは、ウィンドウのタイトルを操作するための制御コードを含む文字列にシェルの対話型プロンプトを設定することによって機能します。シェルのプロンプトが表示されるたびに、ウィンドウのタイトルを変更する制御コードが出力されます。

しかし、もちろん、スクリプトの内部には対話型のプロンプトが表示されないため、これらのコマンドは目立つ効果はありません(スクリプト内で別の対話型シェルを実行するとウィンドウのタイトルが変わることがわかりますが)。そして、どのスクリプトも親プロセスの環境を変更できないため、スクリプトが終了すると変更は失われます。

とにかく、スクリプトから制御コードを直接印刷することもできます。

printf '\033]2;Hello\a'

これによりウィンドウのタイトルが一度変更されますが、後で別のプログラムで再度変更すると古いタイトルが失われます。過去のいくつかの人気プログラムでは、必要に応じてウィンドウのタイトルを変更するとすぐにウィンドウのタイトルを変更することが多かったので、プロンプトを変更する方法は一般的です(これはもはや一般的な問題ではないと思いますが)。欠点は、ウィンドウのタイトルを変更する必要がある実際の理由がある場合、シェルにプロンプ​​トが再表示されると変更が置き換えられることです。

コードで現在のシェルのプロンプトを変更するには、これを通常のスクリプトに入れることはできませんが、sourceスクリプトファイルを使用するか、コマンドをシェル関数(通常はBash設定ファイルで実行)に入れることができます。持続的にしてください)。

ただし、プロンプトの表示幅を計算するという点で、Bashプロンプトには、プロンプトの一部が実際に幅が0のときにBashに通知する追加の制御コードが含まれている必要があります。たとえば、長いコマンドを入力した後にバックスペースを実行する必要がある場合は、改行が不規則であることがわかります。 Bashはプロンプトを再描画しようとしますが、画面制御コードが幅に影響を与えると思うので、間違った場所にあります。プロンプト。これら\[とその周りにBash制御コードを追加する必要があります\]

PS1="$ORIG\[$TITLE\]"

(中括弧は実際には何の目的にも使用されず、読みやすさを妨げるので削除しました。)

おすすめ記事