Führen Sie das Bash-Skript von vim aus


21

Ich benutze vim für Bash-Skripte. Manchmal möchte ich keine neue Datei erstellen, ausführbar machen, ausführen und dann entfernen. Ich meine die Skripte, die nur einmal verwendet werden.

Zum Beispiel öffne ich vim und tippe folgendes:

#!/bin/bash

ll | while read line
do
    echo $line
done

Ich habe diese Datei nicht gespeichert, sondern verwende nur vim, um das Bash-Scripting zu vereinfachen. Ich weiß, dass ich einen Bash-Befehl über !in vim ausführen kann . Aber was ist mit dem Ausführen von allem, was sich im Puffer befindet?


4
Sie wissen, dass Sie die aktuelle Befehlszeile in Vim mit bearbeiten <C-x><C-e>und beim Schreiben ausführen können, oder?
Romainl

Wenn Sie bash mit dieser Option ausführen set -o vi, können Sie Esc-vdie Befehlszeile in vi bearbeiten. Dann Esc-:wqausführen.
Roblogic

Antworten:


35

Ich habe eine ziemlich ausführliche Antwort dazu über Stack-Overflow geschrieben . Die Grundidee besteht darin, dass Sie den Text in Ihrem Puffer in ein externes Programm wie Python oder Bash schreiben können , da es beim Schreibbefehl um das Schreiben und nicht um das Speichern geht. In Ihrem Fall möchten Sie Folgendes tun:

:w !bash

oder

:w !sh

Diese Befehle schreiben buchstäblich nur den Text in Ihrem Puffer direkt in das von Ihnen angegebene Programm !, was praktisch ist, da Sie dann keine Datei speichern müssen. Natürlich können Sie auch Folgendes tun:

:w | !bash %

Dadurch wird Ihre Datei gespeichert und dann als Bash-Skript ausgeführt. Sie können wählen, was für Sie sinnvoller ist.


Gibt es eine Möglichkeit, Optionen auf diese Weise zu argumentieren? Ich habe versucht, :w !bash -a testaber bekam "kann keine Binärdatei ausführen"
St.Antario

@ St.Antario Hmm. Ich bin mir sicher, dass es einen Weg geben muss, aber meine Bash ist ziemlich rostig (ich benutze meistens Fenster). Wenn ich das in cygwin mit einer leeren testDatei versuche, läuft es gut für mich. Was soll der Befehl tun und was soll er testenthalten?
DJMcMayhem

Mein tatsächlicher Fall ist ziemlich kompliziert, also lass ihn einfach das übergebene Argument ausdrucken. Übrigens, was meinst du damit, was test enthalten sollte ? testist nur ein Argument für -a.
St.Antario

1
@ St.Antario Oh, OK, ich verstehe. Ich dachte, testes sollte eine Akte sein. Ich bin mir nicht sicher, was ich tun soll. Wenn Sie etwas Komplexes ausprobieren, ist es möglicherweise besser, es einfach in einer Datei zu speichern. Es könnte sich lohnen, eine separate Frage zu stellen, damit Sie weitere Einzelheiten angeben können. Es wäre wahrscheinlich auch eine gute Frage für Unix und Linux
DJMcMayhem

4

Szenario: Sie arbeiten in der Bash-Shell. Stellen Sie zunächst sicher, dass der lokale Bearbeitungsmodus vi lautet:

$ set -o vi

Wenn Sie nun einen langen Befehl wie den folgenden ausführen, drücken Sie Esc+ v.

$ fjhwfq this is my long command

Dadurch wird Ihr Befehl in eine temporäre viSitzung geladen . Jetzt können Sie es nach Belieben bearbeiten und sogar einen weiteren Befehl hinzufügen ...

fjhwfq some long command
ls -l

Wenn Sie mit der Bearbeitung fertig sind, geben Sie Folgendes ein Esc :wqund die Befehle werden ausgeführt, zum Beispiel:

$ 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
funktioniert möglicherweise nicht, wenn du ein neues macbook ohne Escschlüssel
hast

1
Neue MacBooks haben keine EscSchlüssel !? Wie können sie dann Vim verwenden?
Hubro

1
Jetzt habe ich es versuche, die neue macbook Sensorleiste Dingen hat einen zeigen , EscSchlüssel , wenn in einem Terminal Vim läuft.
Roblogic
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.