web-dev-qa-db-ja.com

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

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

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

これは私の現在のシステムで機能します。 mate-terminalxtermでテストしましたが、これが他のLinuxシステム/プラットフォームや他の端末で機能するかどうかはわかりません。これを達成するためのより良い/よりきれいな(よりポータブルな方法)方法はありますか?

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

あなたに良い結果を与えるかもしれません。これは、セッションリーダーの親であるプロセスの名前を示します。ターミナルエミュレータ内で開始されたプロセスの場合、それは通常、そのターミナルエミュレータを実行しているプロセスです(ただし、screenexpecttmux ...などが使用されている場合を除く) screenおよびtmuxareターミナルエミュレータ)、または新しいセッションがsetsidstart-stop-daemon...)で明示的に開始されることに注意してください。

ネストされた括弧が読みにくい場合は、数行で書くことができます。

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

または、変数を使用します(これは、スクリプトをより自明にするのにも役立ちます)。

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")

wtmpを解析してみることもできます。ここで、端末エミュレーターは通常、疑似端末デバイスに関連付けられたpidを使用してエントリをログに記録します。これは、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-utmp from GNU acctを使用)。

6

現在のシェルで使用されているターミナルエミュレータの名前を見つけるには、Xウィンドウシステムに、シェルが現在表示されているウィンドウの名前を指定するように依頼できます。

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

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

2
Kusalananda