web-dev-qa-db-ja.com

`-c`コマンド文字列で` sh`にコマンドライン引数を使用するにはどうすればよいですか?

そんなこと知ってる

sh -c 'echo $1' sh 4

4を出力します。そして

sh -c 'echo $2' sh 4 5

5を出力します。

しかし、2番目のshの後のパラメーターがsh -cの隣のコマンドにどのように渡されたか理解できません。 bashdashの両方のmanページを読みましたが、この種の構文の概要は見つかりませんでした。

3
gbcat

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
4
eyadof

この動作は実際には 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」セクションでも説明しています。

(ゼロ。)シェルまたはシェルスクリプトの名前に展開されます。

4