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

Thé*_*ile 0 bash alias function pushd

pushd在我的 bash shell 中别名如下,以便它抑制输出:

alias pushd='pushd "$@" > /dev/null'
Run Code Online (Sandbox Code Playgroud)

这在大多数情况下都可以正常工作,但是我现在在带参数的函数中使用它时遇到了麻烦。例如,

test() {
  pushd .
  ...
}
Run Code Online (Sandbox Code Playgroud)

test没有参数的运行很好。但有论据:

> test x y z
bash: pushd: too many arguments
Run Code Online (Sandbox Code Playgroud)

我认为这pushd是试图将其. x y z作为参数,而不仅仅是.. 我怎样才能防止这种情况?是否有一个“本地”等价物$@只能看到.而不是x y z

Sté*_*las 5

别名定义了一种在 shell 事件尝试解析代码之前用某个字符串替换 shell 令牌的方法。它不像函数那样是一种编程结构。

alias pushd='pushd "$@" > /dev/null'
Run Code Online (Sandbox Code Playgroud)

进而:

pushd .
Run Code Online (Sandbox Code Playgroud)

发生的事情是将pushd替换为pushd "$@" > /dev/null,然后解析结果。所以外壳最终解析:

pushd "$@" > /dev/null .
Run Code Online (Sandbox Code Playgroud)

重定向可以出现在命令行的任何地方,所以它完全相同:

pushd "$@" . > /dev/null
Run Code Online (Sandbox Code Playgroud)

或者

> /dev/null pushd "$@" .
Run Code Online (Sandbox Code Playgroud)

当您从提示符运行它时,"$@"是您的 shell 收到的参数列表,因此除非您运行set arg1 arg2,否则它可能为空,因此它与

pushd . > /dev/null
Run Code Online (Sandbox Code Playgroud)

但在函数内,这"$@"将是函数的参数。

在这里,您要么想定义pushd一个函数,如:

pushd() { command pushd "$@" > /dev/null; }
Run Code Online (Sandbox Code Playgroud)

或者像这样的别名:

alias pushd='> /dev/null pushd'
Run Code Online (Sandbox Code Playgroud)

或者

alias pushd='pushd > /dev/null
Run Code Online (Sandbox Code Playgroud)