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/$$/exexprop _NET_WM_PID WM_CLASS. El valor depidlater se puede pasar alps -p <pid> -o argscomando.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/passwdpara 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$SHELLno 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/dasho incluso/bin/bashno 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
xtermcompatibles, lo cual es informado porecho $TERMoecho $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_CLASSpropiedad. Por lo tanto, podemos obtener esoxproptambién:Por supuesto, esto también tiene su 1% de desventajas: establecer
WM_CLASSpropiedades 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
Aboutdiá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 | grepes una mala forma. La mayor parte de lo que puede grep, en realidad se puede obtener porpssí mismo o por otras herramientas.La versión corta (thx @Serg )
La versión larga
y busque el
*en la salida;)
Salida de ejemplo
Alternativa de selección ———————————————– 1 / usr / bin / xterm 2 / usr / bin / uxterm 3 / usr / bin / koi8rxterm 4 / usr / bin / lxterm * + 5 /usr/bin/gnome-terminal.wrapper 6 / usr / bin / konsole 7 /usr/bin/xfce4-terminal.wrapperO, gracias a @muru , aquí hay una salida más detallada
fuente
cat /etc/alternatives/x-terminal-emulator | grep execBinary file (standard input) matchesoupdate-alternatives: error: unknown argument-config ''--configsudo. Usoupdate-alternatives --display x-terminal-emulatorfile /etc/alternatives/x-terminal-emulatorpara obtener el objetivo de este enlace simbólico en lugar de usarlocat. Lafileutilidad debe instalarse en la mayoría de los sistemas y puede usarse para encontrar el ejecutable de destino.caten 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. ¿Essshdrealmente el emulador de terminal?Escriba
printenvdesde la ventana de terminal para ver todas las variables de la sesión abierta.Escriba
echo $COLORTERMdesde la ventana de terminal. NOTA: esto no funciona con todos los terminales, uno comosakurano informa de esto.el de abajo es de una
atermterminal.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-terminalen 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
TERMno 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.