问题:是否有类似于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
我从来没有找到一个钓鱼主义的解决方案,但我觉得这个替代方案值得一提。我采用了在~/bin
中创建shell脚本的方法。缺点是:
- shell配置现在是多个文件
- 解释器无法检查其他简单的别名和函数
然而,我觉得好处是巨大的:
- 脚本可以用任何语言编写
- 脚本完全独立于shell的选择。尝试新的贝壳是非常无痛的。拥有一个不需要用多种语言重写或维护的单一提示脚本是一件令人愉快的事情
这不是一个基于Fish的解决方案,但我怀疑Fish的答案是这是不可能的。
您可以将别名创建为.fish
或.sh
脚本,并将它们符号链接到/usr/local/bin
——这将为您提供等效的行为。