鱼壳中的别名替换

时间:2015-04-22 18:46:38

标签: bash fish

问题:是否存在类似于Bash别名替换的Fish,或者建议的最佳做法是保持代码清洁和干燥?

背景: 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-05-06

我从未找到过Fishism解决方案,但我觉得替代方案值得评论。我采用了在~/bin中创建shell脚本的方法。缺点是:

  • shell配置现在是多个文件。
  • 翻译失去对其他简单别名和功能的检查。

然而,我觉得上升空间非常大:

  • 脚本可以用任何语言编写。
  • 脚本完全独立于shell选择。尝试新的弹壳是非常无痛的。拥有一个不需要用多种语言重写或维护的单一提示脚本是一件令人高兴的事。

1 个答案:

答案 0 :(得分:2)

这不是一个基于鱼类的解决方案 - 但我怀疑鱼的回答是它不可能

您可以将别名创建为.fish.sh脚本,并将它们符号链接到/usr/local/bin - 这将为您提供相同的行为。