シェルスクリプトのみを使用してLinuxでウィンドウのタイトルを取得するには?

シェルスクリプトのみを使用してLinuxでウィンドウのタイトルを取得するには?

ボックスにscreenやxprocなどのツールをインストールすることはできません。タイトルを変更する必要はなく、ウィンドウのタイトル名を見つけるだけです。

echo -e "\033]0;[title]\07";私が知るようにタイトルを修正します。しかし、既存のヘッダ名を知りたいです。

答え1

以下を試してください。しかし、互換性は非常に制限されています。以下の注意事項を参照してください。

get_title(){(
        set -e
        ss=`stty -g`; trap 'exit 11' INT QUIT TERM; trap 'stty "$ss"' EXIT
        e=`printf '\033'`; st=`printf '\234'`; t=
        stty -echo -icanon min 0 time "${2:-2}"
        printf "${1:-\033[21t}" > "`tty`"
        while c=`dd bs=1 count=1 2>/dev/null` && [ "$c" ]; do
                t="$t$c"
                case "$t" in
                $e*$e\\|$e*$st)
                        t=${t%$e\\}; t=${t%$st}; printf '%s\n' "${t#$e\][lL]}";
                        exit 0;;
                $e*);;
                *) break;;
                esac
        done
        printf %s "$t"; exit 1
)}

例:

$ get_title
$ title=`get_title`

またはスクリプトの標準入力が端末でない場合:

$ title=`get_title </dev/tty`

stty+ kludgeは、dd端末が応答としてエスケープされたエントリを報告しない場合、スクリプトがブロックされないようにします\e[21t。この(またはより良い)アプローチは、他の制御シーケンス(たとえば、カーソル位置の取得)と組み合わせて使用​​することもできます。

メモ:

エスケープは「安全でない」と見なされるため、\e[21tこれを機能させるには追加の設定が必要です。

のためxtermecho '*.vt100.allowWindowOps: true' | xrdb -override

のためurxvtecho 'Rxvt.insecure: true' | xrdb -override

そうだろうまったく動作しませんgnome-terminal、、などのvteベースの端末で報告されているようmate-terminalxfce4-terminal徐々に進む(「ターミナル」)または応答のヘッダー。

mlterm特別なものは必要ありませんが、以前にヘッダが設定されていない場合\e]2;TITLE\a(エラーは安定現在のリソースから)。

screen-tC-a A実行中のウィンドウのタイトルではなく、独自のウィンドウタイトル(オプションまたはコマンドを使用して設定されたタイトル)を報告します。

ブロックされており、サポートされていませんtmux

答え2

たとえば、konsole現在のインタラクションbashインスタンスが実行されているウィンドウのタイトルを取得します。

#!/bin/bash

get_title() {

    local pid=$$
    local pids=`pstree -lpsT $pid | tr '-' '\n' | tac | xargs | grep -oE '[0-9]+'`

    for pid in $pids
    do
        local wid=`xdotool search --pid $pid`
        if [ ! -z "${wid}" ]
        then
            echo `xdotool getwindowname $wid`
            exit
        fi
    done
}

get_title

関連情報