Я знаю это
sh -c 'echo $1' sh 4
произведет 4
. и
sh -c 'echo $2' sh 4 5
произведет 5
.
Но я не могу понять как параметры после второго sh
были переданы команде рядом с sh -c
. Я прочитал страницу справочника обоих bash
и dash
но не мог найти введение об этом виде синтаксиса.
От 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.
В Вашей команде второе sh
просто параметр с положением 0
в то время как 4
имеет положение 1
и так далее.
Можно выполнить это для проверки:
$ sh -c 'echo $0' sh 4 5
sh
Это поведение на самом деле указано стандартом POSIX, который все подобные Границе оболочки должны поддерживать для требования себя портативный.
-c [-abCefhimnuvx] sh [-o опция]... [+abCefhimnuvx] [+o опция]... command_string [command_name [аргумент...]]
Посмотрите command_string
параметр? Теперь давайте посмотрим на -c
описание флага:
- c
Считайте команды из command_string операнда. Установите значение специального параметра 0 (см. Специальные Параметры) от значения command_name операнда и позиционных параметров (1$, 2$, и так далее) в последовательности от остающихся операндов аргумента. Никакие команды не должны быть считаны из стандартного входа.
Другими словами, где в нормальном сценарии оболочки $0
(который является обычно именем оболочки в интерактивном режиме или названием сценария, когда Вы запускаете скрипт), был бы установлен самой оболочкой, с -c
необходимо указать его сами. Таким образом,
sh -c 'echo Hi, I am $0 , my first positional parameter is $1' foobar 5
определил бы имя процесса к sh
foobar.
На всякий случай Вы задаетесь вопросом что $0
это также покрыто разделом "Special Parameters" Спецификаций Командного языка Shell:
0
(Нуль). Расширяется до названия сценария оболочки или сценария оболочки.