
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-terminal
y xterm
no 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 ytmux
screen
tmux
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 wtmp
dó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-utmp
de 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