Почему echo не называется / bin / sh -c echo foo output ничего?

15

Например, пока это работает:

$ echo foo
Foo

Это не:

$ / bin / sh -c echo foo

Принимая во внимание, что это делает:

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

Есть ли объяснение?

SilverlightFox
источник

Ответы:

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 ...
Звол
3
ИМХО объяснение было довольно хорошим, но sh -c 'echo $0' fooэто не лучший вариант, учитывая, что спрашивающий уже знает, что /bin/sh -c 'echo foo; echo bar'работает, вы можете просто ответить, цитируя команду/bin/sh -c 'echo foo'
X3MBoy
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
Marco
источник
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 echo \ foo
Foo
$ / bin / sh -c "echo foo"
Foo
$ / bin / sh -c 'echo foo'
Foo

Вывод

Сохраните выполненную команду как одно «слово», используя кавычки.


источник