脚本内别名中的$@:是否有“本地”$@?

脚本内别名中的$@:是否有“本地”$@?

我在 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

相关内容