関数のすべての引数を他のコマンドに渡すには?

関数のすべての引数を他のコマンドに渡すには?

こんにちは、私はこれを持っています。~/.bash_profile

export GOPATH="$HOME/go_projects"
export GOBIN="$GOPATH/bin"

program(){
        $GOBIN/program $1
}

だから私はそれを行うことができますprogram "-p hello_world -tSu"。引用符を使用せずにカスタムフラグを使用してプログラムを実行する方法はありますか?これにより、対応するprogram -p hello_world -tSuフラグのみが使用され、-pスペースの後ろのすべてのエントリは無視されます。

答え1

programシェル関数は、"$@"関数に提供されているすべてのコマンドライン引数のリストを参照するために使用されます。引用符を使用すると、与えられた各コマンドライン引数がprogram個別に引用されます(通常は必要に応じて)。

program () {
    "$GOBIN"/program "$@"
}

これにより、program次のように呼び出すことができます。

program -p hello_world -tSu

hello worldまたは代わりに合格したい場合はhello_world

program -p 'hello world' -tSu

ご存知のように、usingは$1最初のコマンドライン引数だけを参照します(そして$22番目のものも参照します)。値は$1さらにスペースに分割され、拡張が引用されていないため、各結果文字列はファイル名のグロービングを受けます。これにより、空白またはファイル名のグロービングパターンを含む引数が関数に誤って渡されます。

答え2

"$@"Kusalanandaの答えに従って、関数/スクリプトが受け取ったすべての引数を渡す方法を提供することです。

$GOBINしかし、goプログラム内でフォルダを使用しているようであれば、PATHにフォルダを追加する方が良いと思います。

export GOPATH="$HOME/go_projects"
export GOBIN="$GOPATH/bin"
export PATH="$PATH:$GOBIN"

これにより、$GOBIN名前だけを入力すると、その中に保存されているすべてのプログラムを実行できます(既存のプログラムと同じ名前を除く)。追加$ GOBINを$ PATHとして指定すると、このプログラムが選択されます。最後)。

PS:完全性を期すために関数の代わりにエイリアスを使用する3番目のオプションがあります。次の場所に配置できます.bashrc

alias program="$GOBIN/program"

答え3

私に役立つのは次のとおりです。

m() {
    args="$@"
    usql mysql://root@localhost:3306 -c $args
}

デフォルトでは、次のコマンドを実行できるように、コマンドの最後に引用符で囲まれた一連のパラメーターを入れます。

m show databases;

実際に走った

usql mysql://root@localhost:3306 -c "show databases;"

関連情報