我喜欢使用相同的名称将命令封装在 shell 函数中。但为了避免 shell 函数递归调用自身,我指定了命令的完整路径,如下例所示:
less()
{
test 0 -lt $# && echo -ne "\e]2;$@\a\e]1;$@\a" # Window title
/usr/bin/less -i -rS --LONG-PROMPT --shift 5 "$@"
}
但对于某些命令,我不想指定路径,因为它可能会改变。我更愿意使用$PATH
.
例如,我的以下尝试未能mvn
使用反斜杠调用命令:\mvn
mvn() # colorizes maven output
{
\mvn "$@" 2>&1 | #here: the shell-function recursively calls itself indefinitely
sed -u '
s/^\[ALL\].*/\o033[1;37m&\o033[0m/
s/^\[FATAL\].*/\o033[1;31m&\o033[0m/
s/^\[ERROR\].*/\o033[1;31m&\o033[0m/
s/^\[WARNING\].*/\o033[1;33m&\o033[0m/
s/^\[INFO\].*/\o033[1;37m&\o033[0m/
s/^\[DEBUG\].*/\o033[1;36m&\o033[0m/
s/^\[TRACE\].*/\o033[1;32m&\o033[0m/'
}
绕过这个问题的最佳方法是什么?
请不要建议使用不同的 shell 函数名称。
(我通常使用,bash
但我对其他 shell 解决方案感兴趣。)
答案1
在您的实际命令(而不是函数)前面添加command
shell 内置命令,它正是您正在寻找的目的。因此你的 shell 函数应该是这样的:
mvn()
{
command mvn "$@" 2>&1 |
sed -u '
s/^\[ALL\].*/\o033[1;37m&\o033[0m/
s/^\[FATAL\].*/\o033[1;31m&\o033[0m/
s/^\[ERROR\].*/\o033[1;31m&\o033[0m/
s/^\[WARNING\].*/\o033[1;33m&\o033[0m/
s/^\[INFO\].*/\o033[1;37m&\o033[0m/
s/^\[DEBUG\].*/\o033[1;36m&\o033[0m/
s/^\[TRACE\].*/\o033[1;32m&\o033[0m/'
}
答案2
这取决于你使用什么外壳。默认情况下,zfs、bash和ksh不会在aliases中扩展与别名同名的别名。这是专门为了避免[通常是无意的]循环。
因此,您可以安全地发出您想做的命令。
alias ls="echo Hello; ls"
完全没问题。