我使用vim进行bash脚本编写,有时我编写一次性脚本。通常,我不想创建一个新文件,使其可执行,然后执行然后删除。

例如,我打开vim并输入以下内容:

#!/bin/bash

ll | while read line
do
    echo $line
done


我没有保存该文件,我只是使用vim来简化bash脚本编写。我知道我可以通过vim中的!执行bash命令。但是如何执行缓冲区中的所有内容呢?

评论

您知道您可以使用 在Vim中编辑当前命令行,并在写入时执行它,对吧?

如果使用此选项集-o vi运行bash,则可以按Esc-v在vi中编辑命令行。然后执行Esc-:wq。

#1 楼

我在堆栈溢出方面写了一个相当广泛的答案。基本思想是,由于write命令是关于不保存而写的,因此您可以将缓冲区中的文本写入外部程序,例如python或bash。对于您的情况,您可能想执行以下操作:

:w !bash




:w !sh


这些命令从字面上看只需将缓冲区中的文本直接写到使用!指定的程序中,这很方便,因为这样就不需要保存文件。当然,您也可以执行以下操作:

:w | !bash %


,它可以保存文件,然后将其作为bash脚本运行。您可以选择对您更有意义的一种。

评论


有没有办法以这种方式为选项提供参数?我尝试了:w!bash -a测试,但得到“无法执行二进制文件”

–圣安东尼奥
16年11月8日在17:23

@ St.Antario嗯。我敢肯定一定有办法,但是我的bash非常生锈(我主要使用Windows)。当我在cygwin中尝试使用空的测试文件进行测试时,它对我来说运行良好。该命令应该执行什么操作,并且测试应包含哪些内容?

–詹姆斯
16年11月8日在17:27

我的实际情况很复杂,所以让它只打印传入的参数。顺便说一句,您要测试的内容是什么意思?测试只是-a的一个参数。

–圣安东尼奥
16年8月8日在17:48

@ St.Antario哦,知道了。我认为测试应该是一个文件。我不太确定该怎么办。如果您要尝试复杂的操作,最好将其保存在文件中。作为一个单独的问题可能值得提出,因此您可以提供更多详细信息。对于Unix和Linux,这可能也是一个好问题

–詹姆斯
16年11月8日在18:16



#2 楼

场景:您正在使用bash shell。首先,确保本地编辑模式为vi:

$ set -o vi


现在,当您发现自己正在执行如下所示的长命令时,请按Esc + v。 />
$ fjhwfq this is my long command




这会将您的命令加载到临时vi会话中。现在,您可以根据需要进行编辑,甚至可以添加其他命令...

fjhwfq some long command
ls -l



完成编辑后,键入Esc :wq和命令(s)将被执行,例如:

$ 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


评论


如果您有一台没有Esc键的新Macbook,则可能无法工作;)

–roblogic
16-11-10 3:00



新的MacBook没有Esc键!那么他们如何使用Vim?

–Hubro
17年5月19日在9:02



现在我已经尝试过了,新的Macbook触摸栏在终端中运行Vim时确实显示了Esc键。

–roblogic
17年5月23日在3:25

同样,Esc不是返回正常模式的唯一方法。您也可以使用Ctrl-c或Ctrl- [。 vimhelp.org/insert.txt.html#i_CTRL-%5B

–托尼·切萨罗(Tony Cesaro)
20年8月9日在2:33