¿Existe la posibilidad de obtener el tipo de terminal con un comando?
Si estoy usando gnome-terminal
, la salida debería ser gnome-terminal
o algo similar. También sería bueno obtener la versión del terminal.
Actualizar
ps -aux | grep `ps -p $$ -o ppid=`
generará algo como esto:
user 4239 0.0 0.7 292708 15744 pts/8 Sl 11:39 0:02 xfce4-terminal
user 4800 0.0 0.0 6176 820 pts/0 S+ 12:23 0:00 grep --color=auto 4239
Esto también funcionará con xterm, pero ¿cómo obtengo solo el nombre ( xfce4-terminal
en este caso)?
command-line
TuKsn
fuente
fuente
window 31457282 has no pid associated with it
(probado en Lubuntu)Respuestas:
Versión original
Una forma de hacerlo es obtener el proceso principal de su sesión de shell actual y, a partir de ahí, el nombre del terminal.
Obtenga el padre del proceso de shell actual. La variable bash
$$
es el PID de su shell actual, por lo que podemos darle eso como una consulta aps
(-p $$
) y pedirle que imprima el PID del proceso padre (-o ppid=
el final=
es evitar imprimir encabezados de columna):Entonces, el PID del padre de mi shell es
544
.Obtenga el proceso asociado con ese PID e imprima su línea de comando
El resultado anterior dependerá de qué emulador de terminal esté usando, estoy usando
terminator
.Combina todo en un solo comando
Use eso para obtener la versión
Agregue una pequeña función a su
~/.bashrc
que devuelva el nombre y la versión del emulador de terminal que está utilizando (esto funciona para los emuladores de terminal más comunes):Ahora puede obtener el nombre del terminal y también pasarle cualquier opción que desee (como
--version
.Algunos ejemplos con diferentes terminales:
xterm
terminator
rxvt
, Éste tiene ninguno de los-V
,-version
o--version
banderas por lo que no se imprime información de la versión.gnome-terminal
.konsole
lxterminal
xfce4-terminal
Nuevo y mejorado
Sin embargo, el enfoque anterior no es tan confiable. Se ahogará cuando ejecute su shell después de
su
acceder a otro usuario o cuando su terminal tenga un alias para algo y otros casos. Como obviamente estamos trabajando con programas X aquí, una mejor manera podría ser usar algo comoxdotool
(instalable consudo apt-get install xdotool
) para obtener la información:Lo anterior imprimirá la línea de comando utilizada para iniciar la ventana actualmente activa. Dado que su terminal, presumiblemente, estará activo, ese es el comando que mostrará. Esto significa que para la mayoría de los emuladores de terminal, puede asumir con seguridad que el primer campo devuelto es el nombre del terminal:
Esto significa que obtener la versión es trivial. Por ejemplo
No es así para
gnome-terminal
:o
terminator
:Entonces, podemos hacerlo un poco más complejo (hay algunos bashismos aquí, este no es portátil):
Esto funciona para todos los casos que probé.
fuente
$PPID
para obtener el PID del proceso padre.ksh
otcsh
. Sin embargo, es una muy buena idea para la familia bash, ya que es mucho más simple que mi enfoque.ksh93
ymksh
.Prueba esto,
O
fuente
rxvt
yterminator
y la segunda falla enuxterm
ygnome-terminal
(lo imprime/usr/lib/gnome-terminal/gnome-terminal-server
). Todos fallarán (al igual que los míos) si está utilizando una sesión su.$PPID
es el PID del proceso padre del shell.comm
significa comando . Puede o no ser una ruta completa, por lo que usamosbasename
para eliminar la ruta si es necesario.Advertencias
Probablemente, esto también se aplica al menos a algunas de las otras respuestas.
comm
es técnicamenteargv[0]
, lo que en realidad puede ser una cadena arbitraria. Pero, en general, debería poder confiar en él para este caso en particular.Esto no funcionará como se espera si se conecta a través de SSH o usa
tmux
,screen
o algo similar.fuente
termin
como salida.$PPID
no es estándar en todos los depósitos. por ejemplo, entcsh
obtengo:PPID: Undefined variable.
Puedes probar el siguiente comando:Actualización (gracias a OP y Avinash Raj):
fuente
gnome-terminal 3.6.2-0ubuntu1l
en xterm?Otra posibilidad (no perfecta) es:
Pero esto no funciona con lxterminal porque hay una variable de entorno
$WINDOWID
vacía ...Terminator muestra el nombre "x-terminal-emulator".
fuente
El terminal actual también se puede detectar a través de una secuencia de escape: los atributos del dispositivo (DA secundaria)
Por ejemplo en bash:
Esto devuelve solo algún tipo de identificación, y lamentablemente no conozco una lista oficial que los traduzca a los nombres reales.
Para una implementación real, que traduce algunos identificadores conocidos a nombres de terminales, vea este script bash de ejemplo: https://github.com/mintty/utils/blob/master/terminal
fuente