su が提供するシェルに引数を渡します。

su が提供するシェルに引数を渡します。

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

おすすめ記事