6

多数のコマンド ライン引数 (おそらくスペースを含む) を受け取り、それらすべてをログイン シェル経由でプログラム (/bin/some_program) に渡す bash スクリプトを作成しています。bash スクリプトから呼び出されるログイン シェルは、ユーザーのログイン シェルによって異なります。この例では、ユーザーがログイン シェルとして /bin/bash を使用しているとしますが、それは /bin/tcsh などである可能性があります。

some_program に渡される引数の数がわかっている場合は、bash スクリプトに次の行を追加できます。

#!/bin/bash
# ... (some lines where we determine that the user's login shell is bash) ...
/bin/bash --login -c "/bin/some_program \"$1\" \"$2\""

次に、上記のスクリプトを次のように呼び出します。

my_script "this is too" cool

上記の例では、some_program が「これも」と「クール」の 2 つの引数を受け取ることが確認できます。

私の質問は...いくつの引数が渡されるかわからない場合はどうなりますか? my_script に送信されたすべての引数を some_program に渡したいと思います。問題は、これを行う方法がわからないことです。動作しないものを次に示します。

/bin/bash --login -c "/bin/some_program $@"     # --> 3 arguments: "this","is","too"
/bin/bash --login -c /bin/some_program "$@"     # --> passes no arguments
4

2 に答える 2

7

bashマニュアルの引用-c

-cオプションが存在する場合、コマンドは文字列から読み取られます。文字列の後に引数がある場合、それらは$0から始まる位置パラメータに割り当てられます。

私のために働く:

$ cat x.sh
#!/bin/bash
/bin/bash --login -c 'echo 1:$1 2:$2 3:$3' echo "$@"
$ ./x.sh "foo bar" "baz" "argh blargh quargh"
1:foo bar 2:baz 3:argh blargh quargh

どうやって「議論をパスしない」という結論に達したのかわかりません。多分あなたは$0少し逃したのですか?

于 2012-08-21T16:59:43.923 に答える
2

変数を他のスクリプトに埋め込むのは避け、代わりに引数として渡します。この場合:

bash --login -c 'some_program "$@"' some_program "$@"

-c'...'の後の最初の引数は$0と見なされるので、そこにsome_programを配置します。

ちなみに、ログインシェルを要求するのは奇妙な要件です。ユーザーはログインしませんか?

于 2012-08-21T17:00:08.213 に答える