
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
...などを使用しない限り、tmux
screen
tmux
はい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-utmp
GNUから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