Y no digas " $TERM
", siempre es así xterm
.
¿Cómo puede un bash
script decir en qué terminal se está ejecutando, específicamente si es iTerm, Terminal.app o realmente un xterm?
Pregunto porque reset
no funciona¹ fuera de la caja en Terminal.app e iTerm2. iTerm2, sin embargo, reconoce una secuencia de escape para hacer un reinicio de terminal ( \x1b]50;ClearScrollback\x07
), y si pudiera detectarlo, podría anularlo reset
con un alias que haga lo correcto. AFAICT, Terminal.app carece de una secuencia de reinicio, y las personas recurren a la ridícula piratería informática para hackear eso .
Mi objetivo final aquí es tener reset
el mismo trabajo si estoy trabajando en OS X o Linux, trabajando local o remotamente a través de SSH. (No quiero tener que intentar recordar cuál, y es útil hacer reset && command-that-outputs-a-bunch
y tener trabajo de entrada). Terminal.app e iTerm están tirando una llave en este plan al no implementarse reset
correctamente.
Esto significa que simplemente anular reset
no lo es todo: si estoy en una máquina Linux, necesita saber si estoy usando gnome-terminal
o iTerm para enviar la secuencia de escape correcta.
¿Hay alguna manera (incluso si necesito un ioctl
) de preguntarle al terminal qué es realmente ?
¹ Para los fines de esta pregunta, el reinicio debe borrar la pantalla, reiniciar el cursor y borrar el búfer de desplazamiento.
fuente
Terminal.app
la configuración, la pestaña del terminal y establece las líneas de desplazamiento en 0? ¿Deshabilita todo el texto sobre la línea actual, o simplemente cualquier cosa sobre la parte superior de la pantalla? Lo sé, no es exactamente lo que pediste, vale la pena intentarlo.reset
, ya que eso es lo que mis dedos saben.reset
comando borre el contenido de desplazamiento hacia atrás del emulador de terminal, pero no se garantiza que lo haga, porque el desplazamiento hacia atrás es una característica específica del emulador de terminal, no realmente un parte de una terminal. Sin embargo, Terminal admite una extensión de la secuencia de escape ED (Erase in Display) para borrar el desplazamiento hacia atrásESC [ 3 J
. Puede borrar la pantalla y luego usar eso, por ejemploreset && printf '\e[3J’
xterm
(a través deTERM=xterm
) espero que emules un superconjunto del XTerm, que borra su retroceso al reiniciar. (Al igual que si enviaras la secuencia de escape para "azul", esperarías azul). Por supuesto, mi xterm me dice esoErase is backspace.
, y estoy agradecido de que nada más lo haga; Eso es molesto.Respuestas:
Uso
$TERM_PROGRAM
.iTerm lo establece en
iTerm.app
, y Terminal.app enApple_Terminal
.fuente
sshd_config
que estáAcceptEnv
probablemente. Como esto (su shell se ejecuta en un host diferente al que ejecuta su Terminal) es información muy importante, realmente debería ser parte de la pregunta.$TERM
no tiene nada que ver con el emulador de terminal que se está ejecutando actualmente, es solo su terminal predeterminado y se puede configurar para cualquier cosa. Para obtener el nombre del emulador de terminal que está ejecutando, puede usarps
para obtener el PID del proceso principal de su shell actual.NOTA: Lo siguiente fallará en OSX pero debería funcionar bien en Linux
El PID de su proceso actual de shell es
$$
. A partir de ahí, puede usarps
para mostrar un árbol de procesos e imprimir el PID del padre de su sesión de shell actual:Luego puede pasar ese PID
ps
y decirle que imprima el nombre del comando:Eso truncará el nombre, debería ser suficiente para que lo descubras, pero podría no ser bueno para las secuencias de comandos. Para obtener el nombre completo, puedes intentar
Esto es lo que obtengo en mi sistema usando algunas terminales diferentes:
terminator
gnome-terminal
xterm
fuente
ps: illegal option -- f
-
antes de las opciones debería funcionar de acuerdo con OSXman ps
.$2
, PPID es$3
), y el proceso padre del shell puede serlogin
(según la configuración del Terminal), con diferentes parámetros. Sin embargo, su proceso padre esTerminal
.--no-headers
no existe, necesitarías algo asítail -n1
. Y dado que todos los procesos con UI tienen un argumento-psn_0_...
,awk '{print $NF}'
tampoco funciona.Aquí hay una forma portátil de obtener el nombre o la ruta del proceso principal:
iTerm 2:
gnome-terminal en Ubuntu:
Terminal.app:
Tenga en cuenta que si Terminal.app está configurado para abrir nuevos shells con el shell de inicio de sesión predeterminado, el proceso principal del shell es
login
y no el terminal.La
comm
columna es la ruta completa del comando en OS X y el nombre del comando truncado a 15 caracteres en la implementación de procps en Linux.fuente
login
: ¿Personalicé mi perfil hace algún tiempo para ejecutar el comandologin -fp danielbeck
?