如何在 bash 中正确“转发”函数参数?

Posted

技术标签:

【中文标题】如何在 bash 中正确“转发”函数参数?【英文标题】:How does one properly "forward" function arguments in bash? 【发布时间】:2012-05-01 14:46:33 【问题描述】:

我想知道如何将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 会导致错误“文件 /Users/inspector-g/other 和 /Users/inspector-g/header.h 不存在”,但可以解决其他问题。

必须有一些约定来转发我刚刚错过的参数。

【问题讨论】:

【参考方案1】:

您确实错过了专为此案设计的"$@"

【讨论】:

工作就像一个魅力,非常感谢。 $ vars 实在太多了! 确实,$* 在您必须在字符串中转发参数时起作用(例如 mosel -s -c "exec $*"

以上是关于如何在 bash 中正确“转发”函数参数?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用参数制作 Bash 函数? [复制]

如何在bash脚本中通过函数调用将参数/参数从一个函数传递到另一个函数[重复]

如何将文件路径作为 bash 脚本中的参数传递给函数? [复制]

如何转发可选参数

如何通过可变参数模板将多个构造函数参数转发到数组初始值设定项列表?

如何在汇编函数中将元素数组作为参数传递时转发ARM寄存器的地址指针