
私は、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
また、ターミナル エミュレータが通常、疑似ターミナル デバイスに関連付けられた 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-utmp
GNU から使用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