Наприклад, поки це працює:
$ 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