shell – ¿Por qué! Cd no cambia el directorio

Pregunta:

Estoy revisando vimtutor y acabo de aprender a usar:! :!<CMD> para ejecutar un comando de shell desde dentro de vim.

Leí un poco sobre por qué no usar solo :<CMD> y aparentemente es porque algunas secuencias de caracteres como ls son utilizadas por vim.

Muy bien, pero el primero que intenté después ya no salieron como se esperaba: He escrito :!cd some_directory pero esto no tuvo efecto, me quedé en el directorio actual como lo confirma :!pwd .

Sin embargo, hacer :cd some_directory cambió el directorio de trabajo a some_directory .

Estoy un poco confundido aquí. ¿Por qué no funcionó :!cd ?

Editar : Ahora entiendo que:! inicia una nueva shell, pero si he leído correctamente, hasta ahora ninguna de las respuestas han explicado por qué el :cd some_directory hace cambiar el directorio. ¿Es este un comando que se ejecuta en el shell en el que se está ejecutando vim? Si es así, ¿no querría uno tener un símbolo de escape (por ejemplo :|<CMD> ) que siempre redirige los comandos al shell original? De esta manera, uno tendría consistencia en la forma en que tanto :|ls como :|cd funcionarían como se esperaba desde un shell normal. ¿O qué me estoy perdiendo aquí?

Respuesta:

Supongo que es consciente, en general, de la noción de procesos padre e hijo. Particularmente con respecto a las conchas. Digamos que estoy en el caparazón. Mi indicador muestra el directorio actual ( $PWD ) …

[/bar] $ sh     # launch child shell
[/bar] $ cd /foo
[/foo] $ exit
[/bar] $        # back in the parent it's still /bar

Similar…

[/bar] $ sh     # launch child shell
[/bar] $ myvar=something
[/bar] $ exit
[/bar] $ echo $myvar

[/bar] $        # parent knows nothing about myvar

Los procesos de los padres, en términos generales, no se ven alterados por las cosas que ocurren en sus hijos. No es diferente cuando Vim es el padre de un proceso de shell.

Generalmente, si el padre quiere ver qué sucede en el niño, el padre necesita buscarlo. En el caso de Vim, la forma principal de mirar al niño / shell es capturar la salida de sus comandos usando la función system() o usar :r !cmds para leer la salida en un búfer.

En cuanto a la otra versión de la pregunta en la que OP indicó interés, "¿Por qué: cd cambia el directorio?" Asumiré que "el directorio" aquí se refiere al directorio de trabajo actual de un shell lanzado posteriormente … si estuviéramos hablando del directorio de trabajo de Vim, una respuesta justa sería "Porque eso es lo que hace el comando".

:cd es un comando de Vim que opera en el espacio del programa de Vim y el directorio que cambia está asociado con el proceso de Vim. Una forma en que esto es útil es si intenta editar un archivo sin una ruta (por ejemplo, foo.txt ), Vim buscará el archivo en este directorio. Un proceso de shell lanzado posteriormente hereda el directorio de trabajo de Vim porque, bueno, así es como lo han implementado. No tenían que hacerlo de esa manera. Vim no es un "proceso de shell", es un proceso de Vim. Pero es una forma natural de hacer las cosas 1 y muchos están acostumbrados a la herencia parcial con procesos de shell anidados …

[/bar] $ myvar=this                # ordinary variable
[/bar] $ MYVAR=that; export MYVAR  # environment variable
[/bar] $ cd /foo                   # change current working dir
[/foo] $ sh                        # launch child shell
[/foo] $ echo $MYVAR               # c.w.d. inherited
that                               # env vars inherited
[/foo] $ echo $myvar
                                   # regular vars NOT inherited
[/foo] $ 

La ejecución de un comando de shell desde Vim imita ese comportamiento.

1 De hecho, la mayoría de los sistemas operativos admiten este comportamiento de forma automática y predeterminada. Ahí es cuando ejecuta un ejecutivo o una bifurcación o lo que sea para iniciar un nuevo proceso, hay herencia de algún subconjunto definido del contexto / entorno del proceso principal

Leave a Comment

Your email address will not be published.

Scroll to Top

istanbul avukat

-

web tasarım