1 votos

¿Cómo diferenciar vim terminal de terminal regular en bash?

Una versión reciente de vim introdujo el comando :terminal , que inicia un terminal en un nuevo panel de editor.

¿Hay una manera de identificar estos shells lanzados desde vim contra shells regulares lanzados por xterm / urxvt / gnome-terminal?

3voto

Desde el parche Vim 8.1.049 , Vim exporta la variable de entorno VIM_TERMINAL con el valor de v:version . Antes de eso, solo podía evitarlo obteniendo la información del árbol de procesos o, posiblemente, pero no a prueba de errores, probando las variables de entorno $VIM y $VIMRUNTIME .

2voto

Kamil Maciorowski Puntos 897

Enfoque General con ps

Es necesario investigar si el proceso padre de la concha es vim. Esto funciona en mi Debian 9:

pid=1234                              # specify PID of the shell in question
ps -o comm= "$(ps -o ppid= "$pid")"

donde ps -o ppid= "$pid" devuelve el elemento principal del proceso de IDENTIFICACIÓN. Nota si no hay ningún proceso con el PID de $pid, el conjunto de comandos se convertirá ps -o comm= "" que no es válido y producirá un error.

Esto asume que usted sabe la PID. E. g. se puede iterar sobre la salida de pidof bash:

for pid in $(pidof bash); do ps -o comm= "$(ps -o ppid= "$pid")" 2>/dev/null; done

Desde dentro de la propia concha

Dentro de la cáscara de sí mismo el derecho PID es $$, por lo que la anterior se simplifica a

ps -o comm= "$(ps -o ppid= "$$")"   # non-optimal though, see below

Pero también hay $PPID. Que es fijado por la shell para el valor de su padre ID de proceso durante la inicialización de la shell. Por lo tanto, este debe ser casi equivalentes:

ps -o comm= "$PPID"

Casi, porque en general si el proceso padre muere y el shell sobrevive (esto es posible), el huérfano shell de obtener un nuevo padre. Esto se refleja en ps -o ppid= "$$" , pero no por echo "$PPID", creo. En el caso de que la discrepancia no importa, porque:

  1. Si el shell sobrevive, a pesar de los dos enfoques produciendo resultados diferentes, ninguno de los resultados se darán a vim, por lo que la conclusión final será "no vim terminal" de todos modos.
  2. Espero vim a matar conchas comenzó con :terminal cuando sale (no puedo confirmar esto por el momento), por lo que el punto anterior es irrelevante.
  3. Espero una shell interactiva para salir por sí mismo cuando se pierde el control de su terminal; así que, incluso si el anterior expectativa es malo o sólo vim se fuerza muertos (por lo que no pueden enviar señales a sus hijos), el shell va a salir de todos modos. Así que los puntos anteriores son irrelevantes.

Por lo tanto creo que es seguro asumir que los enfoques con y sin $PPID son equivalentes en la práctica.


Nota dependiendo de la configuración y cómo comenzó vim, ps -o comm= ... no puede devolver el literal vim cadena. E. g. puede ser vim.basic, vim.gtk3 o algo más.

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by: