Что это за визуальный артефакт в vim?

Cuando un script de shell comienza con #!, esa primera línea es un comentario en lo que respecta al shell. Sin embargo, los primeros dos caracteres son significativos para otra parte del sistema :el kernel. Los dos caracteres #!se denominan shebang . Para comprender el papel del shebang, debe comprender cómo se ejecuta un programa.

La ejecución de un programa desde un archivo requiere la acción del núcleo. Esto se hace como parte de la llamada al sistema execve. El kernel necesita verificar los permisos del archivo, liberar los recursos (de memoria, etc. )asociados al archivo ejecutable que se está ejecutando actualmente en el proceso de llamada, asignar recursos para el nuevo archivo ejecutable y transferir el control al nuevo programa (y más cosas que no diré ). La llamada al sistema execvereemplaza el código del proceso actualmente en ejecución; hay una llamada al sistema separadaforkpara crear un nuevo proceso.

Para poder hacer esto, el núcleo debe admitir el formato del archivo ejecutable. Este archivo tiene que contener código de máquina, organizado de manera que el núcleo lo entienda. Un script de shell no contiene código de máquina, por lo que no se puede ejecutar de esta manera.

El mecanismo shebang permite que el núcleo delegue la tarea de interpretar el código a otro programa. Cuando el kernel ve que el archivo ejecutable comienza con #!, lee los siguientes caracteres e interpreta la primera línea del archivo (menos el #!inicial y el espacio opcional )como una ruta a otro archivo (más argumentos, que no discutiré aquí ). Cuando se le dice al kernel que ejecute el archivo /my/script, y ve que el archivo comienza con la línea #!/some/interpreter, el kernel ejecuta /some/interpretercon el argumento /my/script. Entonces depende de /some/interpreterdecidir que /my/scriptes un archivo de script que debe ejecutar.

¿Qué sucede si un archivo no contiene código nativo en un formato que el kernel entienda y no comienza con un shebang? Bien,entonces el archivo no es ejecutable y la llamada al sistema execvefalla con el código de errorENOEXEC(Error de formato ejecutable ).

Este podría ser el final de la historia, pero la mayoría de los shells implementan una función de respaldo. Si el kernel devuelve ENOEXEC, el shell examina el contenido del archivo y comprueba si se parece a un script de shell. Si el shell cree que el archivo se parece a un script de shell, lo ejecuta por sí mismo. Los detalles de cómo lo hace depende del shell. Puede ver algo de lo que sucede agregando ps $$en su secuencia de comandos, y más al observar el proceso con strace -p1234 -f -eprocessdonde 1234 es el PID del shell.

En bash, este mecanismo alternativo se implementa llamando a forkpero no a execve. El proceso child bash borra su estado interno por sí mismo y abre el nuevo archivo de script para ejecutarlo. Por lo tanto, el proceso que ejecuta la secuencia de comandos sigue utilizando la imagen del código bash original y los argumentos de la línea de comandos originales pasados ​​cuando invocó bash originalmente. ATT ksh se comporta de la misma manera.

% bash --norc
bash-4.3$./foo.sh 
  PID TTY      STAT   TIME COMMAND
21913 pts/2    S+     0:00 bash --norc

Dash, por el contrario, reacciona a ENOEXECllamando a /bin/shcon la ruta al script pasada como argumento. En otras palabras, cuando ejecuta un script shebangless desde dash, se comporta como si el script tuviera una línea shebang con #!/bin/sh. Mksh y zsh se comportan de la misma manera.

% dash
$./foo.sh
  PID TTY      STAT   TIME COMMAND
21427 pts/2    S+     0:00 /bin/sh./foo.sh

1
08.07.2019, 08:13
1 ответ

Это функция iTerm , а не Vim:

Session -> Open Autocomplete

Autocomplete

Any text that exists in a tab or its scrollback buffer can be autocompleted in that tab. To use autocomplete, type the beginning of a word and then press cmd-;. An autocomplete window opens showing the top 20 choices for words beginning what you have entered. The list can be filtered by typing a subsequence. The filter can be reset by pressing backspace. If you make a selection and press return, it will be entered for you. If you make a selection and press tab, your autocomplete will be extended with the selection.

2
27.01.2020, 23:30

Теги

Похожие вопросы