Например, пока это работает:
$ echo foo Foo
Это не:
$ / bin / sh -c echo foo
Принимая во внимание, что это делает:
$ / bin / sh -c 'echo foo; эхо-бар ' Foo бар
Есть ли объяснение?
Например, пока это работает:
$ echo foo Foo
Это не:
$ / bin / sh -c echo foo
Принимая во внимание, что это делает:
$ / bin / sh -c 'echo foo; эхо-бар ' Foo бар
Есть ли объяснение?
Ответы:
Из 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 -c 'echo "$0"' foo
foo
Так же:
$ sh -c 'echo "$0 $1"' foo bar
foo bar
Это была первая часть, чтобы понять; Второй случай прост и, мне кажется, не нуждается в объяснении.
sh -c 'echo "$@"' fnord a b c d ...
sh -c 'echo $0' fooэто не лучший вариант, учитывая, что спрашивающий уже знает, что /bin/sh -c 'echo foo; echo bar'работает, вы можете просто ответить, цитируя команду/bin/sh -c 'echo foo'
$ echo foo
foo
Это вызывает echoс аргументом foo и foo печатается.
$ /bin/sh -c echo foo
Это вызывает оболочку с аргументом echoи предоставляет foo в качестве аргумента
$0. echoВыводит новую строку и вы выбросите Foo . Если вы хотите вывести foo , укажите аргумент:
sh -c 'echo foo'
или используйте предоставленный аргумент:
sh -c 'echo $0' foo
В этом примере
$ /bin/sh -c 'echo foo; echo bar'
foo
bar
Оболочка вызывается с аргументом, echo foo; echo barкоторый выводит
foo
bar
В этой команде:
echo foo
echoявляется двоичным (или встроенной командой) и fooявляется первым аргументом.
Вот:
/bin/sh -c echo foo
/bin/shэто двоичный файл, первый аргумент которого является -c, который сам принимает "командную строку" в качестве параметра. Это echoв приведенном выше примере. Тогда есть третий аргумент: fooэто аргумент для /bin/sh, а не для echo. Вот почему в вашем третьем примере:
/bin/sh -c 'echo foo; echo bar'
... оба напечатаны. Вы процитировали аргумент. Таким образом: первый аргумент есть -c, а параметр этого аргумента 'echo foo; echo bar'интерпретируется как один аргумент; как «командная строка».
Структура sh -c wordвыполняет только слово (в оболочке).
Добавленные слова означают другие вещи, такие как аргумент ноль, один, два и т. Д .:
sh -c word zero one two three
чтобы сохранить команду с пробелами в одном слове, необходимо заключить в кавычки:
sh -c 'echo fnord' zero one two three
Итак, это печатает все аргументы:
$ sh -c 'echo "args=" "$0" "$@"' zero one two three
args = zero one two three
В приведенном вами примере: /bin/sh -c echo fooпервое слово (после опций) - echoэто то, что выполняется. И эхо без текста будет печатать только новую строку, ничего больше:
$ / bin / sh -c echo foo
Вот почему вы получаете пустую строку.
Если вы заключите в кавычки пробел, вы будете выполнять «одно слово» (без пробелов), как это:
$ / bin / sh -c echo \ foo Foo $ / bin / sh -c "echo foo" Foo $ / bin / sh -c 'echo foo' Foo
Сохраните выполненную команду как одно «слово», используя кавычки.
sh -c 'echo $1' echo foo