如何从Vim中访问shell或运行外部命令

您可能已经知道,Vim是功能强大且功能强大的编辑器。 在youcl中,我们在Vim上编写了几个教程,涵盖了其基本用法插件以及其他一些有用的功能。 但是鉴于Vim提供的功能,我们总是找到一些有用的东西来分享我们的读者群。

在本教程中,我们将重点介绍如何执行外部命令以及从编辑器窗口访问命令行shell。

But before we start doing that, it's worth mentioning that all the examples, commands, and instructions mentioned in this tutorial have been tested on Ubuntu 14.04, and the Vim version we've used is 7.4.

在Vim中执行外部命令

有时您可能需要在Vim编辑器窗口内执行外部命令。 例如,考虑一种情况,您在Vim中打开了一个文件,进行了一些更改,然后在尝试保存这些更改时,Vim会抛出一个错误,表示您没有足够的权限。

现在,退出当前的vim会话并再次以足够的权限打开文件将意味着您所做的所有更改都将丢失,因此,您将同意在大多数情况下不是一个选择。 像这样的情况,从编辑器中运行外部命令的能力派上用场。

稍后我们再回到上面的用例(**),但现在我们来了解如何从vim中运行基本的命令。

假设在编辑文件时,您想知道文件所包含的行数,字数和字符数。 为了做到这一点,在Vim的命令模式下,只需输入一个冒号(:),然后是一个bang(!),最后是命令(在这种情况下为'wc'),后跟文件名(使用当前文件的%)。

:! wc %

以下是一个例子:

具有上述命令的文件准备执行:

这是终端的输出:

看完输出后,按Enter键,您将被带回Vim会话。

在您正在编写代码或脚本,并希望快速知道代码/脚本是否包含任何编译时或语法错误的情况下,此功能可以非常方便。

继续,如果需要将输出添加到文件,请使用':read!' 命令。 以下是一个例子:

:read ! wc %

'read'命令将外部命令的输出插入正在编辑的文件中当前行下方的新行。 如果需要,您还可以指定特定的行号 - 输出将在特定行之后添加。

例如,以下命令将在文件的第二行之后添加“wc”的输出。

:2read ! wc %

注意在最后一行之后使用'$'插入,在第一行之前插入'0'。

现在,回到我们在开始(**)中讨论的usecase,这里的命令将帮助您保存文件,而不需要先关闭它(这意味着没有丢失未保存的更改),然后打开它,说, sudo

:w ! sudo tee %

访问外壳在Vim

除了执行单个命令之外,您还可以将自己从Vim中的新启动的shell中删除。 为此,您需要做的是从编辑器运行以下命令:

:shell

要么

:sh

并在完成shell工作时键入“exit” - 这将使您重新进入从最初离开的Vim会话。

要记住的漏洞

虽然访问shell的能力肯定在现实世界中有其自己的用途,但它也可以用作特权升级技术。 正如我们之前的教程(在sudoedit中)所解释的那样,即使您提供用户sudo访问权限,只能通过Vim编辑一个文件,他们也可以使用这种技术从编辑器中启动一个新的shell,然后可以做“root”或超级用户。

结论

在Vim中运行外部命令的能力是一个重要的功能,可以在许多情况下派上用场(其中一些我们在本教程中提到过)。 这个功能的学习曲线并不陡峭,所以初学者和有经验的用户都可以利用它。

你现在使用这个功能已经有一段时间了吗? 你有分享的东西吗? 请在下面的意见中留下您的想法。

赞(52) 打赏
未经允许不得转载:优客志 » 系统运维
分享到:

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏