Наприклад, поки це працює:
$ 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 відлуння \ foo foo $ / bin / sh -c "відлуння" foo $ / bin / sh -c 'echo foo' foo
Зберігайте виконану команду як одне «слово», використовуючи цитування.
sh -c 'echo $1' echo foo