pstree
を使用して、次のようなものを使用して、実行中のシェルスクリプトの親エミュレーターの名前を検索しました。
pstree -s $PPID | awk -F '---' '{print $6}'
これは私の現在のシステムで機能します。 mate-terminal
とxterm
でテストしましたが、これが他のLinuxシステム/プラットフォームや他の端末で機能するかどうかはわかりません。これを達成するためのより良い/よりきれいな(よりポータブルな方法)方法はありますか?
ps -o comm= -p "$(($(ps -o ppid= -p "$(($(ps -o sid= -p "$$")))")))"
あなたに良い結果を与えるかもしれません。これは、セッションリーダーの親であるプロセスの名前を示します。ターミナルエミュレータ内で開始されたプロセスの場合、それは通常、そのターミナルエミュレータを実行しているプロセスです(ただし、screen
、expect
、tmux
...などが使用されている場合を除く) screen
およびtmux
areターミナルエミュレータ)、または新しいセッションがsetsid
、start-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
を使用)。
現在のシェルで使用されているターミナルエミュレータの名前を見つけるには、Xウィンドウシステムに、シェルが現在表示されているウィンドウの名前を指定するように依頼できます。
$ xwininfo -id $WINDOWID | awk '/^xwin/ { print $NF }'
これにより、XTermでは文字列"xterm"
が返され、Rxvt-unicodeで実行すると"urxvt"
が返されます。ただし、ウィンドウのタイトルを変更する習慣がある場合は、結果が異なる可能性があります。これは、ここで返されるものだからです。