vim no puede ejecutar el comando unix con:! debido al cambio de caparazón


8

Nuestra empresa utiliza el sistema Red Hat Linux y asigna a todos una cuenta en / home. Desafortunadamente, nuestro sistema está usando tsch, lo que no es favorable para mí. Además, como no tengo el permiso de superusuario, no puedo usar el comando chsh para cambiar a bash por mí mismo. Peor aún, ypchsh tampoco está disponible para mí. Entonces, por fin, agrego las siguientes líneas en el .cshrc:

    bash
    echo $0

y configure el .bashrc adecuadamente (copiando del .cshrc original y reparando el error de sintaxis necesario). Ahora el shell aparente se convierte en bash (como se puede mostrar desde el comando "echo $ 0").

Ahora surge el problema:

Cuando uso vim para editar un archivo cpp (por ejemplo, Hello_World), y uso ":! G ++ -g Hello_World.cpp -o hw.out" en vim para compilar el archivo, no se mostrará ningún resultado, y vim se cierra con se muestra "bash" (como cuando un terminal está abierto), pero sin el habitual "presionar una tecla" para volver a mi trabajo en vim. En la carpeta Hello_World.cpp, hay un archivo .Hello_World.cpp.swp, pero no hw.out. Cuando vim Hello_World.cpp nuevamente, resulta que este archivo cpp ha sido abierto.

Sin embargo, si g ++ el archivo cpp en la carpeta pero no uso vim y:!, Todo está bien. De hecho, :! ahora parece ser ilegal para vim.

Si uso el tcsh original, todo también está bien.

¿Cómo podría solucionar este curioso error?

Gracias de antemano por su amable ayuda.

qing

Por cierto: prefiero bash a tcsh principalmente debido a su conveniencia de HISTIGNORE e HISTCONTROL, aunque tcsh también tiene configuración histdup.

Encontré lo siguiente un poco útil pero aún no satisfactorio para mi problema.

¿Cómo ejecutar comandos de Unix desde Vim?


Use chshpara cambiar su shell de inicio de sesión.
Ярослав Рахматуллин

Respuestas:


8

Pon esto en tu script .login:

setenv SHELL /bin/bash
exec bash -l

La primera línea establece la variable de entorno SHELL. La segunda línea reemplaza a tcshcon bash, pero le dice que se ejecute como un shell de inicio de sesión (por bashlo que procesará su .profileetc.). Puede agregar una -iopción para hacerlo interactivo; No debería ser necesario.


2
También puedes ponerlo set shell=/bin/bashdentro de VIM. De esa manera, puede mantener su shell, pero use BASH en VIM y evite los !problemas. Sin embargo, veo que OP prefiere bash de todos modos, por lo que su solución no solo resolverá el problema de VIM, sino que le dará a OP su shell preferido.
David W.

Tienes razón, @DavidW. Dado que cualquiera puede configurar su shell en vim(o vi) a lo que quiera, es básicamente imposible restringir el acceso a un sistema si permite que el usuario acceda viao vim. En el pasado, las personas han intentado configurar el shell en un programa especial que solo ejecuta ciertos comandos. Sin embargo, si uno de esos comandos es vio vim, tienen acceso al sistema de todos modos.
Jonathan Leffler

Lamento que, como soy un novato en este sitio web, no sé cómo comentar esta respuesta antes. Muchas gracias por su ayuda. @JonathanLeffler y DavidW.
JQK

2

El shell predeterminado para cualquier usuario se almacena en el archivo / etc / passwd. El usuario puede cambiar su shell predeterminado a cualquiera de los shells listados en / etc / shells emitiendo el chshcomando. Consulte las páginas del manual de chsh (1) y shells (5) para obtener más información.

Esta respuesta es "más correcta" que el enfoque de reemplazar el shell actual después de iniciar sesión porque, en primer lugar, no es necesario iniciar el shell no deseado. Ese enfoque es útil solo cuando el administrador ha descuidado el archivo / etc / shells y se le olvida agregar bash (nunca).


Hola, Pax, gracias por tu respuesta. Pero no tengo permiso para ejecutar el comando chsh. El administrador tampoco quiere usar chsh para cambiar mi shell. Gracias de todos modos.
JQK

1

Gracias por toda su gran ayuda.

Antes de dar la solución final que elijo, debo señalar un error en mi pregunta original. Mi .cshrc original tiene las siguientes tres líneas:

     bash
     source ~/.bashrc
     echo $0

Eché de menos escribir la segunda línea antes. Lo siento.

Ahora, probé estos dos métodos, y los resultados se muestran a continuación.

1) método .vimrc

Si yo escribo

     bash
     source ~/.bashrc
     echo $0

en ~ / .cshrc

y

     set shell=/bin/bash

en ~ / .vimrc

sin ningún archivo ~ / .login, vim y:! g ++ está bien, pero:! gdb a.out tiene algún error. Además, "echo $ 0" da "bash" pero "echo $ SHELL" da "/ bin / tcsh". No sé exactamente la diferencia entre $ 0 y $ SHELL.

2) método de inicio de sesión

Si yo escribo

     setenv SHELL /bin/bash
     bash
     source ~/.bashrc
     echo $0

en .login

pero ni nada como "set shell = ..." en ~ / .vimrc ni "bash ..." en ~ / .cshrc, todo está bien. Ahora, "echo $ 0" da "bash" y "echo $ SHELL" da "/ bin / bash".

El bash en la segunda línea se puede reemplazar por "bash -l". Cabe señalar que si lo reemplazo por "exec bash" o "exec bash -l", no podré iniciar sesión en mi cuenta. (El sistema se cierra automáticamente rápidamente). Tampoco sé por qué.

Creo que el segundo método es genial. Agradezco mucho tu ayuda.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.