【发布时间】:2015-04-22 18:46:37
【问题描述】:
问题:是否有与 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 非常轻松。拥有一个无需用多种语言重写或维护的单一提示脚本是一种乐趣。
【问题讨论】:
-
第一反应:no。下一个反应:由于鱼别名只是变相的函数,因此您可以创建一个
xg函数来组合bashx和g别名。 -
@glennjackman 当你说结合时,你的意思是
function xg; xargs -rd\\n grep -EID skip -d skip --color=auto --line-buffered $argv; end?这正是我想要避免的,因为我需要在两个地方分别定义“g”和x功能,g、xg、x。 -
这正是我的意思。 fish 没有等效于 bash 的别名替换(或 zsh 的全局别名),所以我认为您没有太多选择。我想你可以说像
function x; xargs -rd\\n fish -c "$argv"; end这样的话,但这可能充满了陷阱 -
@glennjackman 谢谢,这是我想避免使用的 Bash 解决方法之一。我想我会在我的路径中添加一个愚蠢的“g”脚本。