Чому відлуння не називається як / bin / sh -c echo foo нічого не виводить?


15

Наприклад, поки це працює:

$ echo foo
foo

Це не так:

$ / bin / sh -c echo foo

Враховуючи це:

$ / bin / sh -c 'echo foo; ехо-бар '
foo
бар

Чи є пояснення?

Відповіді:


21

З 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

Це була перша частина, яка зрозуміла; другий випадок простий і не потребує пояснень, я думаю.


2
Більш суворий, стандартний спосіб будеsh -c 'echo $1' echo foo
jlliagre

1
sh -c 'echo "$@"' fnord a b c d ...
zwol

3
ІМХО пояснення було досить хорошим, але sh -c 'echo $0' fooце не найкращий варіант, враховуючи, що /bin/sh -c 'echo foo; echo bar'/bin/sh -c 'echo foo'
запитуючий

1
@ X3MBoy Опитуючий вже знає, що / bin / sh -c 'echo foo' працює чудово. Він хотів повторити щось поза тим, що я пояснив
Іджаз Ахмад Хан

18
$ 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

8

У цій команді:

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'що трактується цілим як один аргумент; як "командний рядок".


3

Структура 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

Висновок

Зберігайте виконану команду як одне «слово», використовуючи цитування.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.