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?
别名定义了一种在 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)