Ejecutar script bash desde vim


21

Yo uso vim para las secuencias de comandos bash. a veces no quiero crear un archivo nuevo, hacerlo ejecutable, ejecutarlo y luego eliminarlo. Me refiero a los guiones que se usarán solo una vez.

Por ejemplo, abro vim y escribo esto:

#!/bin/bash

ll | while read line
do
    echo $line
done

No guardé este archivo, solo uso vim para simplificar bash-scripting. Sé que puedo ejecutar un comando bash a través !de vim. Pero, ¿qué hay de ejecutar todo lo que está en el búfer?


44
Sabes que puedes editar la línea de comandos actual en Vim con <C-x><C-e>y ejecutarla al escribir, ¿verdad?
romainl

Si ejecuta bash con esta opción set -o vi, puede presionar Esc-vpara editar la línea de comando en vi. Luego Esc-:wqde ejecutar.
roblogic

Respuestas:


35

Escribí una respuesta bastante extensa sobre esto en stack-overflow . La idea básica es que, dado que el comando de escritura trata de escribir no guardar , puede escribir el texto en su búfer en un programa externo, como python o bash. En su caso, desearía hacer algo como:

:w !bash

o

:w !sh

Estos comandos literalmente solo escriben el texto en su búfer directamente en el programa que especifique !, lo cual es conveniente porque entonces no necesita guardar un archivo. Por supuesto, también puedes hacer algo como:

:w | !bash %

que guarda su archivo y luego lo ejecuta como un script bash. Puedes elegir el que tenga más sentido para ti.


¿Hay alguna forma de proporcionar opciones a un argumento de esta manera? Lo intenté :w !bash -a testpero obtuve "no se puede ejecutar el archivo binario"
St.Antario

@ St.Antario Hmm. Estoy seguro de que debe haber alguna forma, pero mi golpe está bastante oxidado (uso principalmente Windows). Cuando lo intento en cygwin con un testarchivo vacío , me funciona bien. ¿Qué se supone que debe hacer el comando y qué debe testcontener?
DJMcMayhem

Mi caso real es bastante complicado, así que permíteme imprimir el argumento pasado. Por cierto, ¿qué quieres decir con lo que debe test contener? testes solo un argumento para -a.
St.Antario

1
@ St.Antario Oh, está bien, ya veo. Pensé que testse suponía que era un archivo. No estoy realmente seguro de qué hacer. Si está intentando algo complejo, podría ser mejor guardarlo en un archivo. Puede valer la pena hacer una pregunta por separado para que pueda proporcionar más detalles. Probablemente también sea una buena pregunta para Unix y Linux
DJMcMayhem

4

Escenario: estás trabajando en bash shell. Primero, asegúrese de que el modo de edición local sea vi:

$ set -o vi

Ahora, cuando te encuentres trabajando en un comando largo como el siguiente, presiona Esc+ v.

$ fjhwfq this is my long command

Esto cargará su comando en una visesión temporal . Ahora puede editarlo como desee e incluso agregar otro comando ...

fjhwfq some long command
ls -l

Cuando haya terminado de editar, escriba Esc :wqy se ejecutarán los comandos, por ejemplo:

$ fjhwfq some long command
fjhwfq some long command
bash: fjhwfq: command not found
ls -l
total 44
-rw-r--r-- 1 ropata Domain Users 24073 Nov 10 14:17 _viminfo
drwxr-xr-x 1 ropata Domain Users     0 Jul 15 13:57 bin/
-rw-r--r-- 1 ropata Domain Users   956 Nov  7 10:43 custom_env

3
podría no funcionar si tiene un nuevo macbook sin Escclave;)
roblogic

1
¿Las nuevas MacBooks no tienen Escllaves? ¿Cómo pueden usar Vim entonces?
Hubro

1
Ahora lo he probado, el nuevo MacBook barra táctil cosita hace mostrar una Escclave cuando se ejecuta en un terminal de Vim.
roblogic
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.