Linux

在 shell 腳本中獲取終端模擬器名稱

  • January 23, 2022

我曾經使用pstree類似於以下內容來查找執行 shell 腳本的父模擬器的名稱:

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

這適用於我目前的系統。我進行了測試mate-terminalxterm但不確定這是否適用於其他 Linux 系統/平台和其他終端。有沒有更好/更整潔(更便攜)的方式來實現這一點?

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

可能會給你帶來好的結果。它給出了作為會話領導者的父程序的名稱。對於在終端仿真器中啟動的程序,這通常是執行該終端仿真器的程序(除非正在使用諸如screenexpect、 … 之類的東西(儘管請注意和終端仿真器),或者使用, ..顯式啟動新會話。 .)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 與偽終端設備相關聯。這適用於我在 Debian 系統上提供的期望/螢幕/tmux… 不涉及:

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

引用自:https://unix.stackexchange.com/questions/264329