2015-04-22 73 views
4

问题:是否存在与Bash的别名替换相当的鱼,或者建议最佳做法以保持代码的清洁和干燥?别名在鱼壳中的替换

背景:在Bash中有一个非常有用的功能叫做别名替换。它在手册页中简要提及:

alias [-p] [name[=value] ...] 
    ... 
    A trailing space in value causes the next word to be checked for alias substitution when the alias is expanded. 
    ... 

此功能的强大功能可以通过示例轻松传达。考虑到许多用户定义了一个grep别名。这里是我的:

# extended regex, skip binaries, devices, sockets, & dirs, colored, & line 
# -buffered. use a non- canonical alias instead of GREP_OPTIONS which may wreck 
# poorly written scripts 
alias g='grep -EID skip -d skip --color=auto --line-buffered' 

同样,许多这些相同的用户为xargs定义了一个别名。这里是我的没有别名替代:

alias x='xargs -rd\\n' # \n delimited, don't run on empty in 

最后,这里就是我可能要使用它,但它不工作:

$ find|x g foo 
xargs: g: No such file or directory 

,因为x被扩大到xargs的这个命令失败,它无法找到名为g的可执行文件。这有很多解决方法,但我认为大多数都很糟糕。然而,仅仅通过增加一个尾部空间,shell将代表我们执行别名替换和该命令将工作打算:

alias x='xargs -rd\\n ' # \n delimited, don't run on empty in, + expansion 
#     ^-- this space is for expanding a subsequent alias 

请记住,这是只是一个例子,不一定是实际用例。

更新2015年5月6日

我从来没有发现一个Fishism解决办法,但我觉得选择是值得评论。我采用了在~/bin中创建shell脚本的方法。缺点是:

  • shell配置现在是多个文件。
  • 解释器失去对其他简单别名和函数的检查。

不过,我觉得有利的一面是相当巨大的:

  • 脚本可以用任何语言来编写。
  • 脚本完全独立于shell选项。尝试新的炮弹是非常痛苦的。拥有一个不需要用多种语言重写或维护的单个提示脚本是一种乐趣。
+0

第一反应:[no](http://fishshell.com/docs/current/commands.html#alias)。下一个反应:因为鱼别名只是变相的函数,所以你可以创建一个'xg'函数来组合bash'x'和'g'别名。 –

+0

@glennjackman当你说联合,你的意思是'函数xg; xargs -rd \\ n grep -EID跳过-d跳过--color =自动--line-buffered $ argv; end'?这正是我想要避免的,因为我需要在'g','xg','x'两个地方定义''g''''''和'x''函数。 –

+0

这就是我的意思。鱼没有等同于bash的别名替换(或zsh的全局别名),所以我认为你没有太多的选择。我想你可以说类似'function x; xargs -rd \\ n fish -c“$ argv”;结束“,但这可能充满了陷阱 –

回答

2

这不是鱼的解决方案 - 但我怀疑鱼的答案是这是不可能的

你可以创建你的别名为.fish.sh脚本,并将其符号链接到/usr/local/bin - 这会给你的等效行为。

+0

谢谢,这是我目前使用的一种解决方法,除了我使用'〜/ bin'外,不过这不是没有缺点。 –