Tengo Ubuntu en mi máquina y estoy ejecutando un increíble administrador de ventanas encima. ¿Cómo verifico qué terminal estoy ejecutando? ¿Hay un comando para ello?
command-line
gnome-terminal
usuario4943481
fuente
fuente
Respuestas:
TL; DR
ls -l /proc/$$/exe
xprop _NET_WM_PID WM_CLASS
. El valor depid
later se puede pasar alps -p <pid> -o args
comando.Técnicamente, para el emulador de terminal ni siquiera necesita un comando, como se indica en los comentarios :
Shell vs Terminal
Lo primero que debemos aclarar es qué es exactamente lo que se pregunta: averiguar el shell o el terminal en ejecución. A menudo, estos dos términos se usan indistintamente, pero son cosas completamente diferentes. Shell es el intérprete de línea de comandos, específicamente el shell interactivo es el indicador más el campo de texto donde ingresa los comandos. Los shells también pueden ser no interactivos, por ejemplo, un script inicia un shell no interactivo o
bash -c 'echo hello world'
también inicia un shell no interactivo.Por el contrario, el terminal es la interfaz de shell (aunque también podría ser otra aplicación). Originalmente, el terminal se refería al hardware real, pero hoy en día son principalmente software. Lo que ve cuando presiona Ctrl+ Alt+ to hace clic en el icono del terminal en la GUI, que inicia un emulador de terminal, una ventana que imita el comportamiento del hardware, y dentro de esa ventana puede ver el shell en ejecución. Ctrl+ Alt+ F2(o cualquiera de las 6 teclas de función) abrirá la consola virtual, también conocido como
tty
. Recomiendo leer ¿Por qué un terminal virtual es "virtual" y qué / por qué / dónde está el terminal "real"? Para más información sobre los detalles.Obteniendo la información del shell
Cada usuario tiene un shell predeterminado asignado
/etc/passwd
para su nombre de usuario. Suponiendo que está utilizando la configuración predeterminada y no ha llamado explícitamente a otro shell como comando, es suficiente hacer lo siguiente:Pero, por supuesto, esto solo muestra el valor predeterminado . Supongamos que hacemos lo siguiente:
Estábamos originalmente en
bash
, pero empezamos sesión interactiva de/bin/dash
, POSIX de Ubuntu o shell del sistema . La variable$SHELL
no cambiará, porque ese no es su propósito: muestra el valor predeterminado no actual. Tendremos que abordar esto desde otra perspectiva: la perspectiva de un proceso, que es algo que he cubierto ¿Estoy usando bash o sh?Aquí aprovechamos el
/proc/
sistema de archivos. El nombre del proceso y los parámetros de la línea de comandos se muestran en/proc/<pid>/comm
. Todo lo que necesitamos es proporcionar el PID de shell, que es lo que$$
hace. En el ejemplo anterior, estoy agregando eso por separado, pero no hay nada que nos impida hacer soloLa variación sobre el tema también podría ser
Otra forma de abordar esto es mediante la comprobación de dónde
/proc/<pid>/exe
. Este archivo es un enlace simbólico que apunta al archivo ejecutable. Así podemos hacerCualquiera de los dos enfoques funciona en el 99% de los casos. Por supuesto, hay formas en que se pueden subvertir. Por ejemplo, el enlace simbólico no apuntará a ninguna parte si el ejecutable se eliminó poco después de la cáscara comenzó (y en ese caso es probable que se encontrará con problemas en el sistema, ya que la remoción
/bin/sh
,/bin/dash
o incluso/bin/bash
no se recomienda - después de todo, una gran cantidad de secuencias de comandos dependen de ellos , especialmente los de nivel de sistema). El nombre del comando para shell generalmente se establece como el primer argumento enexecve()
syscall. Esto está cubierto en ¿Cómo sabe bash cómo se invoca? , por lo que si tiene una aplicación que inicia un shell a través deexecve()
, podría darle cualquier nombre. Pero estas son cosas no estándar y no típicas, que deben evitarse en aras de la coherencia y la seguridad.Obteniendo información del terminal
Podemos comenzar con las variables de entorno. Muchos terminales parecen enmascararse como
xterm
compatibles, lo cual es informado porecho $TERM
oecho $COLORTERM
. Pero entonces las variables de entorno no son una herramienta muy confiable. Se pueden activar y desactivar. Podemos hacer lo mismo con los PID nuevamente, excepto que esta vez veremos el PID primario. Como recordará, el terminal es la interfaz del shell y, a menudo, inicia el shell en sí. Por lo tanto, podemos averiguar qué proceso es el proceso padre de nuestro shell:Probemos con otra aplicación de terminal
sakura
:A partir de ahí ya podemos ver que lo que inició este shell es
gnome-terminal
. Este método, por supuesto, funciona asumiendo que está trabajando con un shell interactivo. Si estamos tratando de averiguar el padrebash -c '...'
o el shell iniciado a través dessh
, por ejemplo, PID puede muy bien ser de una aplicación no terminal y tal vez no GUI.Entonces, si queremos ocuparnos específicamente del terminal GUI, lo que podemos hacer es ejecutar
xprop
, hacer clic en la ventana deseada, seleccionar su pid y descubrir cuál es el nombre de ese proceso que coincide con pid. O en otras palabras:Además, según las especificaciones , los administradores de ventanas deben establecer la
WM_CLASS
propiedad. Por lo tanto, podemos obtener esoxprop
también:Por supuesto, esto también tiene su 1% de desventajas: establecer
WM_CLASS
propiedades depende de que el administrador de ventanas lo haga, y PID no garantiza que una ventana sea precisa (consulte ¿Qué proceso creó esta ventana X11? ), Lo que puede implicar una depuración compleja. Y estos no son defectos de los métodos en sí, sino del servidor X11. Sin embargo, los gestores de ventanas más estables y conocidos (como openbox, Metacity, blackbox) y la mayoría de las aplicaciones se comportan bien, por lo que no deberíamos esperar problemas con algo como Gnome Terminal o Terminator.Pero cuando se trata de emuladores de terminal GUI, ni siquiera necesitamos encontrar un comando. Podemos usar el
About
diálogo de la ventana en sí. La excepción a esa regla esxterm
.fuente
$SHELL
, segurops | grep
?ps -p $$
! O, simplemente, para el comando,ps -p $$ -o cmd=
.ps | grep
es una mala forma. La mayor parte de lo que puede grep, en realidad se puede obtener porps
sí mismo o por otras herramientas.La versión corta (thx @Serg )
La versión larga
y busque el
*
en la salida;)
Salida de ejemplo
O, gracias a @muru , aquí hay una salida más detallada
fuente
cat /etc/alternatives/x-terminal-emulator | grep exec
Binary file (standard input) matches
oupdate-alternatives: error: unknown argument
-config ''--config
sudo
. Usoupdate-alternatives --display x-terminal-emulator
file /etc/alternatives/x-terminal-emulator
para obtener el objetivo de este enlace simbólico en lugar de usarlocat
. Lafile
utilidad debe instalarse en la mayoría de los sistemas y puede usarse para encontrar el ejecutable de destino.cat
en el enlace simbólico podría imprimir cualquier script de shell o incluso un archivo binario dependiendo del destino de este enlace (script de shell paragnome-terminal
, archivo binariourxvt
, etc.).Si desea conocer el programa de terminal que está utilizando, use esto:
Ejecute esto justo después de abrir el terminal (shell) sin bifurcar ninguna otra instancia de shell .
Cuando abres el programa terminal, básicamente genera un programa hijo, un shell. Entonces el padre del shell generado es el terminal en sí. En otras palabras, el PPID del shell es el PID del programa terminal.
Aquí estamos encontrando el ID del proceso padre (PPID) del shell (
bash
) porps -o 'ppid=' -p $$
, que será el ID del proceso del programa terminal.Luego estamos encontrando el nombre del proceso del PID:
Básicamente es un trazador de líneas de:
fuente
sshd: username@pts/4
. Tenga en cuenta que estoy usando PuTTY para conectarme a la máquina. ¿Essshd
realmente el emulador de terminal?Escriba
printenv
desde la ventana de terminal para ver todas las variables de la sesión abierta.Escriba
echo $COLORTERM
desde la ventana de terminal. NOTA: esto no funciona con todos los terminales, uno comosakura
no informa de esto.el de abajo es de una
aterm
terminal.fuente
Si solo desea el nombre del programa de terminal, probablemente lo encontrará en Ayuda> Acerca de.
fuente
Salida de muestra:
Ahí está la respuesta para mi sistema: gnome-terminal .
Entonces, escribir
gnome-terminal
en mi terminal ahora abrirá otra ventana de terminal idéntica.Fuentes:
fuente
Respuesta simple Funciona tanto para consola como para ssh.
Ejemplo para terminal de caracteres simple:
le dice que no puede abrir aplicaciones GUI en esa conexión
Ejemplo para xterm (también funciona con PuTTY / Xming en Windows)
significa que puede usar comandos GUI como abrir el editor de hojas o el administrador de archivos nautilus.
En la consola es lo mismo:
fuente
TERM
no es una variable que define el emulador de terminal predeterminado, sino que define las capacidades del emulador actual. Por ejemplo, establecer la variable en "xterm-color" permite que cualquier programa que se ejecute en el terminal sepa que el terminal actual debe comprender los colores; establecerlo en "linux" le dice a los programas que se supone que es un VT; etc.