在vim中运行Bash aliases

我比较喜欢用bash的alias,如果一些命令老是重复出现或者容易输错,我就会将它们写成alias,或者稍微复杂一点,写一个函数。慢慢地也还累积了不少alias,用得也很习惯,以至于我用别人的电脑,总不太适应,alias另外也会导致某些命令的自动补全失效。我这里要说的另外一个问题,我们知道在vim及其它一些工具中可以执行外部命令,但是它并不能执行alias和函数,这就比较令人困惑,我不得不输入展开的alias,而使用alias的不良后果之一就是容易忘记原来的命令,需要在alias和展开的形式之间切换是件很麻烦的事。函数和alias也类似,但是要展开函数就更麻烦了,由于两者的相似性,下文我只说alias,其实对函数也是适用的。

首先明白为什么不能在vim中使用alias是有好处的。进程要执行一个命令只能依靠系统函数execve(在它之前可能要先调用fork函数),它的函数声明如下:

int execve(const char *filename, const char *argv[], const char *envp[]);


execve只识别文件名,Bash之所以能够识别alias,是因为在调用execve之前它已经将alias展开了,这有点类似C语言的宏。alias为bash所独有,vim无法识别,类似地,其它外部命令也识别不了。这样我们就很容易理解为什么xargs、find、sudo等命令中不能使用alias了,却可以在管道中使用。举个例子:


alias grep='grep -i --color=auto'

find . -name '*.py' -exec grep 'class' '{}' \;

find . -name '*.py' | grep hello


第一条命令定义了grep的alias,第二条命令执行find,它同时调用grep命令,由于find属于外部命令,它只能执行外部的grep命令,而不是在第一条命令中定义的alias。第三条命令包含管道,管道实际上是个复合命令,它包含两个子命令,分别是find和grep,均由bash执行,在执行之前会先扩展每条命令,所以这里执行的grep就是第一条命令中扩展后的alias,整条命令相当于执行:

find . -name '*.py' | command grep -i --color=auto


简单地说,只有Bash才知道alias,所以在外部(vim, find, xargs中)运行alias的唯一方法就是通过bash去运行。

bash -ic 'your alias'

-c选项表示从参数中读取命令,而不是向通常那样从文件中读取。-i表示在交互模式下运行,只有在交互模式下才会扩展alias。Bash分为交互模式和非交互模式,通常我们打开一个bash进入是交互模式,会有一命令提示符等待用户输入,用户从键盘输入(或者重定向从文件读入),然后bash执行用户命令,将结果输入至标准输出,执行完毕又显示提示符等待用户输入,这是交互模式。运行脚本时运行的是非交互模式,例如"bash hello.sh",在hello.sh中命令是在非交互模式下执行的,这时不会扩展alias,可以用选项-i将它切换到交互模式下。所以脚本在一般情况下是不会扩展alias的,除非你在执行时指定了-i选项,这么做的原因很明显,因为alias是非常个性化,而脚本却希望在所有机器上的行为表现一致,如果你刚好alias了系统脚本中的某条命令,那么这个脚本可能就会运行不正常。在vim中执行alias其实还有一个简单的方法,就是设置shellcmdflag选项:

:set shellcmdflag=-ic

这样就可以直接使用':!your_alias'来执行bash alias了。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值