そんなこと知ってる
sh -c 'echo $1' sh 4
4
を出力します。そして
sh -c 'echo $2' sh 4 5
5
を出力します。
しかし、2番目のsh
の後のパラメーターがsh -c
の隣のコマンドにどのように渡されたか理解できません。 bash
とdash
の両方のmanページを読みましたが、この種の構文の概要は見つかりませんでした。
man sh
から:
-c string If the -c option is present, then commands are read from
string. If there are arguments after the string, they are
assigned to the positional parameters, starting with $0.
コマンドでは、2番目のsh
は位置0
のパラメータにすぎませんが、4
は位置1
を持っています。
これを実行して、次のことを確認できます。
$ sh -c 'echo $0' sh 4 5
sh
この動作は実際には POSIX標準 で指定されており、すべてのBourneのようなシェルは、移植性があると主張するためにサポートする必要があります。
sh -c [-abCefhimnuvx] [-oオプション] ... [+ abCefhimnuvx] [+ oオプション] ... command_string [コマンド名[引数...]]
command_string
パラメータを参照してください。 -c
フラグの説明を見てみましょう:
-c
Command_stringオペランドからコマンドを読み取ります。 command_nameオペランドの値と定位置パラメーター($ 1、$ 2など)から特殊パラメーター0(特殊パラメーターを参照)の値を設定します。残りの引数オペランドから順番に。標準入力からコマンドを読み取ることはできません。
言い換えると、通常のシェルスクリプトでは$0
(通常はインタラクティブモードのシェル名、またはスクリプトを実行するときのスクリプト名)がシェル自体によって設定され、-c
を指定する必要があります。自分で。したがって、
sh -c 'echo Hi, I am $0 , my first positional parameter is $1' foobar 5
プロセス名をsh
foobarに設定します。
$0
が何であるか疑問に思っている場合に備えて、 Shell Command Language Specifications の「Special Parameters」セクションでも説明しています。
(ゼロ。)シェルまたはシェルスクリプトの名前に展開されます。