问题:是否存在与 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 选择。尝试新的 shell 非常轻松。拥有一个无需以多种语言重写或维护的提示脚本是一件令人愉快的事情。
最佳答案
这不是基于 fish 的解决方案——但我怀疑 fish 的答案是不可能。
您可以将别名创建为 .fish
或 .sh
脚本并将它们符号链接(symbolic link)到 /usr/local/bin
—— 这将给你等效的行为。
关于bash - fish shell 中的别名替换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29806347/