Obtenga el nombre del emulador de terminal dentro del script de shell

Obtenga el nombre del emulador de terminal dentro del script de shell

Solía pstree​​​​buscar el nombre del emulador principal del script de shell en ejecución usando algo similar a lo siguiente:

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

Esto funciona en mi sistema actual. Lo probé mate-terminaly xtermno estoy seguro de si esto funcionará en otros sistemas/plataformas Linux y otras terminales. ¿Existe una forma mejor/más ordenada (más portátil) de lograr esto?

Respuesta1

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

Puede darte buenos resultados. Da el nombre del proceso que es el padre del líder de la sesión. Para los procesos iniciados dentro de un emulador de terminal, ese sería generalmente el proceso que ejecuta ese emulador de terminal (a menos que se utilicen cosas como screen, expect, ... (aunque tenga en cuenta que ytmuxscreentmux sonemuladores de terminal), o las nuevas sesiones se inician explícitamente con setsid, start-stop-daemon...)

O dividirlo en pasos individuales usando variables (lo que también puede ayudar a que el guión se explique por sí mismo):

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

La eliminación de espacios en blanco alrededor de los números aquí se realiza mediante $((...))expansión aritmética. También puedes hacerlo usando el operador split+glob (suponiendo que no esté modificado $IFS) o como lo sugiere @ack en los comentarios usando xargs:

ps -o sid= -p "$$" |
  xargs ps -o ppid= -p |
  xargs ps -o comm= -p

También puede intentar analizar wtmpdónde los emuladores de terminal suelen registrar una entrada con su pid asociado con el dispositivo pseudo-terminal. Esto funciona para mí en un sistema Debian siempre que expect/screen/tmux... no estén involucrados:

ps -o comm= -p "$(
  dump-utmp -r /var/log/wtmp |
  awk -v tty="$(ps -o tty= -p "$$")" -F ' *\\| *' '
    $2 == tty {print $5;exit}')"

(usando dump-utmpde GNU acct).

Respuesta2

Para encontrar el nombre del emulador de terminal utilizado por el shell actual, puede pedirle al sistema de ventanas X que le proporcione el nombre de la ventana en la que el shell está visible actualmente:

$ xwininfo -id $WINDOWID | awk '/^xwin/ { print $NF }'

"xterm"Esto me devuelve la cadena en XTerm y "urxvt"cuando ejecuto en Rxvt-unicode. Sin embargo, el resultado probablemente será diferente si tiene la costumbre de cambiar el título de la ventana, porque creo que eso es lo que se le devuelve aquí.

Respuesta3

Sobre la base destephane-chazelassolución para que funcione bajo tmux (es decir, devolver el emulador de terminal que el cliente tmux está usando para mostrar), esto parece funcionar para mí:

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

información relacionada