シェルスクリプト内でターミナルエミュレータ名を取得する

シェルスクリプト内でターミナルエミュレータ名を取得する

私は、pstree次のようなものを使用して、実行中のシェル スクリプトの親エミュレータの名前を見つけていました。

pstree -s $PPID | awk -F '---' '{print $6}'

これは現在のシステムでは動作します。テストしましたmate-terminalが、xterm他の Linux システム/プラットフォームや他の端末でも動作するかどうかはわかりません。これを実現するための、より優れた/より整然とした (よりポータブルな) 方法はありますか?

答え1

ps -o comm= -p "$(($(ps -o ppid= -p "$(($(ps -o sid= -p "$$")))")))"

良い結果が得られるかもしれません。セッションリーダーの親プロセスの名前を示します。端末エミュレータ内で開始されたプロセスの場合、通常はその端末エミュレータを実行しているプロセスになります(、、screen...などが使用されていない限り(ただし、expectおよびはtmuxscreentmux setsid端末エミュレーターを使用する場合、または、、... を使用して新しいセッションを明示的に開始する場合start-stop-daemon)

または、変数を使用して個々のステップに分解します (これにより、スクリプトがよりわかりやすくなります)。

sid=$(ps -o sid= -p "$$")
sid_as_integer=$((sid)) # strips blanks if any
session_leader_parent=$(ps -o ppid= -p "$sid_as_integer")
session_leader_parent_as_integer=$((session_leader_parent))
emulator=$(ps -o comm= -p "$session_leader_parent_as_integer")

ここで数字の周りの空白の除去は、$((...))算術展開を使用して行われます。split+glob 演算子 ( が変更されていないと仮定$IFS) を使用するか、コメントで @ack が提案したように を使用することもできますxargs

ps -o sid= -p "$$" |
  xargs ps -o ppid= -p |
  xargs ps -o comm= -p

また、ターミナル エミュレータが通常、疑似ターミナル デバイスに関連付けられた pid を含むエントリをログに記録する場所を解析することもできますwtmp。expect/screen/tmux が関係していない場合、これは Debian システムで動作します。

ps -o comm= -p "$(
  dump-utmp -r /var/log/wtmp |
  awk -v tty="$(ps -o tty= -p "$$")" -F ' *\\| *' '
    $2 == tty {print $5;exit}')"

( dump-utmpGNU から使用acct)。

答え2

現在のシェルで使用されている端末エミュレータの名前を見つけるには、シェルが現在表示されているウィンドウの名前を X ウィンドウ システムに要求します。

$ xwininfo -id $WINDOWID | awk '/^xwin/ { print $NF }'

"xterm"これは、XTerm で文字列を返します。また"urxvt"、Rxvt-unicode で実行する場合も返されます。ただし、ウィンドウ タイトルを変更する習慣がある場合は、結果がおそらく異なります。これは、ここで返されるのがウィンドウ タイトルであるためだと思います。

答え3

構築するステファン・シャゼラスtmux で動作させるための解決策 (つまり、tmux クライアントが表示に使用しているターミナル エミュレーターを返す) は、私の場合は次のように動作するようです。

TERMINAL_EMULATOR="$(ps --pid $(ps --pid $$ -o ppid=) -o comm=)"
if [[ "${TERMINAL_EMULATOR}" =~ tmux ]]; then
    export TERMINAL_EMULATOR=$(ps --pid "$(($(ps --pid $(ps --pid $(tmux display-message -p "#{client_pid}") -o sid=) -o ppid=)))" -o comm=)
else
    export TERMINAL_EMULATOR
fi

関連情報