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

He utilizado pstree para encontrar el nombre del emulador principal de ejecutar script de shell usando algo similar a lo siguiente:

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

Esto funciona en mi sistema actual. Probé en mate-terminal y xterm pero no estoy seguro si esto funcionará en otros sistemas / plataforms Linux y otras terminales. ¿Hay una manera mejor / más orderada (forma más portátil) de lograr esto?

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

Puede darte buenos resultados. Da el nombre del process que es el padre del líder de la session. Para los processs iniciados dentro de un emulador de terminal, ese sería generalmente el process que ejecuta ese emulador de terminal (a less que cosas como screen , expect , tmux … estén siendo usadas, o nuevas sesiones se inicien explícitamente con setsid , start-stop-daemon … .)

También podría intentar analizar wtmp donde los emuladores de terminal generalmente registran una input 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 desde GNU acct ).

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

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

Esto me devuelve la cadena "xterm" en XTerm y "urxvt" cuando ejecuto Rxvt-unicode. El resultado probablemente será diferente si tienes el hábito de cambiar el título de la window, porque eso es lo que te estoy devolviendo aquí, creo.