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

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

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

一般wtmpに、端末エミュレータによって記録された項目と疑似端末装置を使用する関連PIDを解析することもできます。予想/画面/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 Window Systemに現在のシェルに表示されているウィンドウ名を問い合わせます。

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

Rxvt-unicodeで実行すると、"xterm"XTermに文字列が返されます。"urxvt"ウィンドウのタイトルを変更する習慣がある場合は、結果が異なる場合があります。ここで返される内容がまさにこれであると仮定します。

答え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

関連情報