Например, пока это работает:
$ 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