我想知道如何将bash
中的函数的参数正确“转发”到另一个函数或程序。
例如,在Mac OS X中有一个命令行程序open
(man page),它将使用其默认应用程序打开指定的文件(即它将在Xcode中打开一个* .h文件,或Finder中的文件夹等)。我想简单地在没有参数的情况下调用open
来打开Finder中的当前工作目录,或者为它提供正常使用它的典型参数。
我想,“我只会使用一个功能!”呃,我想不是那么快。这是我得到的:
function open
{
if [ $# -eq 0 ]; then
/usr/bin/open .
else
/usr/bin/open "$*"
fi
}
只需调用open
即可,它会在Finder中打开工作目录。调用open myheader.h
效果很好,它会在Xcode中打开“myheader.h”。
但是,调用open -a /Applications/TextMate.app myheader.h
尝试在TextMate而不是Xcode中打开文件会导致错误“无法找到名为'/Applications/TextMate.app myheader.h'的应用程序”。似乎将"$*"
传递给/usr/bin/open
会导致我的整个参数列表仅作为一个参数转发。
将函数更改为仅使用usr/bin/open $*
(无引号)会导致带空格的路径出现问题。调用open other\ header.h
然后会导致错误“文件/用户/检查器-g / other和/Users/inspector-g/header.h不存在”,但解决了另一个问题。
必须有一些转发参数的约定,我只是错过了。
答案 0 :(得分:11)
你确实错过了"$@"
,这是针对这种情况设计的。