2012-04-20 20 views
6

我想知道如何將參數bash中的函數正確「轉發」到另一個函數或程序。如何在bash中正確「轉發」函數參數?

例如,Mac OS X中有一個命令行程序openman page),將打開指定的文件,其默認的應用程序(即,它會打開在Xcode一個* h文件,或在搜索文件夾,等等)。我想簡單地調用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不存在」,但解決了另一個問題。

必須有一些轉發參數的約定,我只是錯過了。

回答

9

你確實錯過了"[email protected]",這是專爲這種情況而設計的。

+0

工作就像一個魅力,非常感謝你。有那麼多的'$'變數! – 2012-04-20 01:42:06

+0

事實上'$ *'在你必須在一個字符串內轉發參數(例如'mosel -s -c「exec $ *」') – 2014-06-15 14:47:27