man su
説明する:
You can use the -- argument to separate su options from the arguments
supplied to the shell.
man bash
説明する:
-- A -- signals the end of options and disables further option
processing. Any arguments after the -- are treated as filenames
and arguments. An argument of - is equivalent to --.
それでは、見てみましょう。
[root ~] su - yuri -c 'echo "$*"' -- 1 2 3
2 3
[root ~] su - yuri -c 'echo "$*"' -- -- 1 2 3
2 3
[root ~] su - yuri -c 'echo "$*"' -- - 1 2 3
1 2 3
[root ~] su - yuri -c 'echo "$*"' - 1 2 3
1 2 3
私が期待したもの(2番目のコマンドの出力が異なります):
[root ~] su - yuri -c 'echo "$*"' -- 1 2 3
2 3
[root ~] su - yuri -c 'echo "$*"' -- -- 1 2 3
1 2 3
[root ~] su - yuri -c 'echo "$*"' -- - 1 2 3
1 2 3
[root ~] su - yuri -c 'echo "$*"' - 1 2 3
1 2 3
たぶん大きな問題ではないかもしれません。しかし、そこで何が起こりましたか? 2番目と3番目のバリエーションは良いようですが、そのうちの1つは機能しません。 4番目のオプションは信頼性が低いため、オプション-
として使用できます。su
ベストアンサー1
シェルに提供する最初の引数は引数です$0
(通常はシェルの名前になります)。これにより、以外のすべてのパラメータは含まれecho $*
ませ$*
ん$0
。
例:
# su - graeme -c 'echo "\$0 - $0"; echo "\$* - $*"' -- sh 1 2 3
$0 - sh
$* - 1 2 3
修正する
次のコマンドを実行します。
strace -f su graeme -c 'echo $0; echo "$*"' -- -- 1 2 3
追跡線を生成します。
[pid 9609] execve("/bin/bash", ["bash", "-c", "echo $0; echo \"$*\"", "1", "2", "3"], [/* 27 vars */] <unfinished ...>
したがって、この場合、バグ(または少なくとも文書化されていない動作)のために追加のコンテンツをbashに渡さずにsu
飲み込むように見えます。--
ただし、複数の--
引数を使用しません。
# su graeme -c 'echo $0; echo "$*"' -- -- -- 1 2 3
--
1 2 3