我在 bash shell 中设置了别名,pushd
如下所示,以便它抑制输出:
alias pushd='pushd "$@" > /dev/null'
这在大多数情况下都可以正常工作,但我现在在带有参数的函数中使用它时遇到了麻烦。例如,
test() {
pushd .
...
}
不带参数运行test
就可以了。但有争论:
> test x y z
bash: pushd: too many arguments
我认为这pushd
是试图将其. x y z
作为参数而不是仅仅作为参数.
。我怎样才能防止这种情况发生?是否有一个“本地”等价物$@
只能看到.
而不能看到x y z
?
答案1
别名定义了一种在 shell 事件尝试解析代码之前用某个字符串替换 shell 标记的方法。它不是像函数那样的编程结构。
在
alias pushd='pushd "$@" > /dev/null'
进而:
pushd .
发生的事情是pushd
替换为pushd "$@" > /dev/null
然后解析结果。所以 shell 最终解析:
pushd "$@" > /dev/null .
重定向可以出现在命令行的任何位置,因此它与以下内容完全相同:
pushd "$@" . > /dev/null
或者
> /dev/null pushd "$@" .
当您从提示符运行该命令时,"$@"
您的 shell 收到的参数列表是,除非您运行set arg1 arg2
,否则它可能为空,因此它将与
pushd . > /dev/null
但在函数内,这"$@"
将是函数的参数。
在这里,您要么想要定义pushd
为如下函数:
pushd() { command pushd "$@" > /dev/null; }
或者像这样的别名:
alias pushd='> /dev/null pushd'
或者
alias pushd='pushd > /dev/null