摘要: Vim——正如你可能已经了解的那样——是一个包含很多特性的强大的编辑器。我们已经写了好多关于 Vim 的教程,覆盖了 基本用法、 插件, 还有一些 其他的 有用的 特性。鉴于 Vim 提供了多如海洋的特性,我们总能找到一些有用的东西来和我们的读者分享。
Vim——正如你可能已经了解的那样——是一个包含很多特性的强大的编辑器。我们已经写了好多关于 Vim 的教程,覆盖了 基本用法、 插件, 还有一些 其他的 有用的 特性。鉴于 Vim 提供了多如海洋的特性,我们总能找到一些有用的东西来和我们的读者分享。
在这篇教程中,我们将会重点关注你如何在编辑窗口执行外部的命令,并且访问命令行 shell。
但是在我们开始之前,很有必要提醒一下,在这篇教程中提及到的所有例子、命令行和说明,我们已经在 Ubuntu 14.04 上测试过,我们使用的的 Vim 版本是 7.4 。
在 Vim 中执行外部命令
有的时候,你可能需要在 Vim 编辑窗口中执行外部的命令。例如,想象一下这种场景:你已经在 Vim 中打开了一个文件,并做了一些修改,然后等你尝试保存这些修改的时候,Vim 抛出一个错误说你没有足够的权限。
在 Vim 中执行命令行
在 Vim 中执行命令行
现在,退出当前的 vim 会话,重新使用足够的权限打开文件将意味着你会丢失所做的所有修改,所以,你可能赞同,在大多数情况不是只有一个选择。像这样的情况,在编辑器内部运行外部命令的能力将会派上用场。
稍后我们再回来上面的用例,但是现在,让我们了解下如何在 vim 中运行基本的命令。
假设你在编辑一个文件,希望知道这个文件包含的行数、单词数和字符数。为了达到这个目的,在 vim 的命令行模式下,只需要输入冒号 :,接下来一个感叹号 !,最后是要执行的命令(这个例子中使用的是 wc)和紧接着的文件名(使用 % 表示当前文件)。
:! wc %
这是一个例子:
填入的上面提及的命令行准备执行:
命令准备在 vim 中执行
命令准备在 vim 中执行
下面是终端上的输出:
命令输出
命令输出
在你看到输出之后,输入回车键,你将会退回到你的 vim 会话中。
你正在编写代码或者脚本,并且希望尽快知道这段代码或者脚本是否包含编译时错误或者语法错误,这个时候,这种特性真的很方便。
继续,如果需求是添加输出到文件中,使用 :read ! 命令。接下来是一个例子:
:read ! wc %
read 命令会把外部命令的输出作为新的一行插入到编辑的文件中的当前行的下面一行。如果你愿意,你也可以指定一个特定的行号——输出将会添加到特定行之后。
例如,下面的命令将会在文件的第二行之后添加 wc 的输出。
:2read ! wc %
注意: 使用 $ 在最后一行插入, 0 在第一行前面插入。
现在,回到最开始我们讨论的一个用例,下面的命令将会帮助你保存文件而不需要先关闭文件(这将意味着没有保存的内容不会丢失)然后使用 sudo 命令重新打开。
:w ! sudo tee %
在 Vim 中访问 shell
除了可以执行单独的命令,你也可以在 vim 中放入自己新创建的 shell。为了达到这种目的,在编辑器中你必须要做的是运行以下的命令:
:shell
或者:
:sh
当你执行完了你的 shell 任务,输入 exit —— 这将带你回到原来离开的 Vim 会话中。
要谨记的漏洞
虽然在真实世界中,能够访问的 shell 绝对符合它们的用户权限,但是它也可以被用于提权技术。正如我们在早期的一篇文章(在 sudoedit 上)解释的那样,即使你提供给一个用户 sudo 的权限只是通过 Vim 编辑一个文件,他们仍可以使用这项技术从编辑器中运行一个新的 shell,而且他们可以做 root 用户或者管理员用户可以做的所有内容。
总结
能够在 Vim 中运行外部命令在好多场景中(有些场景我们已经在这篇文章中提及了)都是一个很有用的特性。这个功能的学习曲线并不麻烦,所以初学者和有经验的用户都可以好好使用它。
原文发布时间为:2017-03-25
本文来自云栖社区合作伙伴“Linux中国”
用云栖社区APP,舒服~
分享到:
相关推荐
5. `/lib`:存储系统运行所需的动态链接库。 6. `/lost+found`:当系统非法关机后,这里可能会有恢复的文件。 7. `/etc`:系统配置文件和子目录的所在地。 8. `/usr/local`:用户安装的应用程序通常存放于此,类似...
此外,内部命令执行速度较快,因为它们是 Shell 的一部分,而外部命令则需要从磁盘加载。在需要提高效率时,可以考虑使用内建命令。 Shell 脚本广泛应用于系统管理、自动化任务、数据处理等领域,通过掌握以上基础...
这包括内置命令(如`echo`、`if`语句)和外部命令(如`ls`、`grep`)。 3. **控制结构**:用于控制脚本的执行流程,包括条件语句(如`if`、`case`)、循环语句(如`for`、`while`)和错误处理机制。 4. **输入与...
1. 高亮显示:在VIM中,可以使用搜索命令(/)找到特定字符串(如"CPU缓存"),然后使用`>`和`命令将选区加亮。 2. 替换文本:使用`:s/no/yes/g`命令全局替换"no"为"yes"。 3. 撤销操作:在VIM的命令模式下,输入`u`...
- `read`命令用于从标准输入读取一行文本,并将其拆分成单词,然后存储到shell变量中。 - **2.7.2 常用选项** - `-p` 提示符 - `-s` 密码模式 - `-n` 读取N个字符 - `-t` 超时时间 - `-r` 不转义反斜杠 - **...
这些命令可以是内置命令、外部命令或脚本文件。 - **自动化任务执行**: 通过Shell脚本,可以将一系列命令组织起来,实现任务的自动化执行。 ##### 2. Shell程序的编辑与运行 - **编辑文件**: 使用文本编辑器如`vi`...
- **外部命令**:这些命令独立于Shell解释器之外,存储为程序文件。 - **命令格式**:Linux命令的一般格式如下:`命令 [选项] [参数]` - `命令`:指具体要执行的操作。 - `选项`:用于调整命令的行为,通常以`-`...
这一步骤是为了确保能够从官方仓库中获取最新的软件包。 **命令示例**: ```bash vim /etc/yum.repos.d/mongodb-org-3.6.repo ``` 接下来,在打开的文件中添加以下内容: ```bash [mongodb-org-3.6] name=...
在准备这些软件包之前,需要确保系统已连接至互联网,并能够成功配置IP地址和网关以访问外部网络资源。 2. 安装与配置步骤 配置MZD无盘Linux客户端涉及一系列终端命令操作,具体步骤如下: a. 升级系统补丁 首先,...
- **配置防火墙**:允许外部客户端通过TCP协议访问PostgreSQL默认端口5432。 ```shell firewall-cmd --add-port=5432/tcp firewall-cmd --add-port=5432/tcp --zone=public --permanent ``` **2.8 其他工具安装...
- **命令执行和环境变量**:解释如何在shell中执行命令及如何设置和使用环境变量。 - **“$LANG”变量**:用于指定语言环境的环境变量。 - **“$PATH”变量**:用于定义命令搜索路径的环境变量。 - **“$HOME”...
8. **进程管理**:了解ps、top和kill命令,可以帮助你监控和控制运行中的进程。 9. **文件系统与挂载**:认识不同的文件系统类型(如ext4、FAT32、NTFS),了解如何挂载外部设备,以及df和du命令用于查看磁盘空间。...
在NAT模式下使用SSH,主要是为了让虚拟机与主机或者外部网络通过安全的Shell协议进行通信。SSH(Secure Shell)是一种网络协议,用于在不安全的网络上提供安全的远程登录和其他服务。以下将详细解释如何在Ubuntu...