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

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

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

おすすめ記事