在bash别名中使用管道

时间:2014-03-08 13:31:47

标签: bash pipe alias

我没有shell脚本的经验,所以我无法看到以下情况的问题:

我已定义以下表单的别名(file.c位于~/dir):

alias code="cd ~/dir | vim file.c"

输入时,我收到以下警告,并且没有打开正确的文件:

Vim: Warning: Input is not from a terminal
2 files to edit

我认为此实例中的管道操作符会将两个命令分开,首先更改目录,然后打开文件。

3 个答案:

答案 0 :(得分:5)

既然你提到你没有shell的经验,我会很详细。

问题是您使用的管道错误。

cmd1 | cmd2

表示将cmd1的输出重定向到cmd2的输入。 也许你将它与OR运算符||混淆,它可以用作:

cmd1 || cmd2

“如果cmd1不成功,请执行cmd2”。不过,这对你的情况没有帮助。 以前的答案都适合你:

alias code="cd ~/dir; vim file.c"

使用分号,这只是一个简单的命令分隔符。或者我个人最喜欢的

alias code="cd ~/dir && vim file.c"

使用AND运算符。

cmd1 && cmd2

表示“执行cmd1。如果成功,请继续执行cmd2。否则,请停止”。

答案 1 :(得分:3)

你不需要管道。使用分号作为命令分隔符。

alias code="cd ~/dir; vim file.c"

您还可以在别名中使用pushd and popd返回上一个目录。

答案 2 :(得分:3)

更好的别名是:

alias code="cd ~/dir && vim file.c && cd -"

如果cd失败,这将确保您不会在当前目录中打开文件并返回到您所在的旧目录。