2012-04-13 1 views
3
$ sh 
sh-3.2$ if 
> ps -ef | grep apple ; 
> then 
> echo APPLE 
> fi ; 
lazer 7584 7571 0 04:36 pts/4 00:00:00 grep apple 
APPLE 
sh-3.2$ exit 
exit 
$ which sh 
/bin/sh 
$ /bin/sh -c if ps -ef | grep apple ; then echo APPLE fi ; 
bash: syntax error near unexpected token `then' 
$ 

Как и выше, мой простой, если оператор работает, как ожидалось, когда выполняется построчно, но дает мне следующую ошибку при выполнении с помощью sh -c:код не работает с ш -с, но работает на ш непосредственно

bash: syntax error near unexpected token `then'

Что мне здесь не хватает?

+0

Вы понимаете, что 'grep' всегда будет соответствовать себе здесь? Что вы на самом деле делаете? – Sorpigal

+0

Это был небольшой фрагмент кода NOOP, который я использовал, чтобы показать проблему. – Lazer

ответ

2

Ваша интерактивная оболочка будет избегать вызова через sh -c. В частности, он делает все возможное после того, как полуточка станет новым заявлением.

Укажите все, что вы подаете, до /bin/sh, например.

$ /bin/sh -c "if ps -ef | grep apple ; then echo APPLE fi ;" 

Я думаю, что вам может понадобиться, чтобы разграничить дальнейшее использование точки с запятой, учитывая, что вы конденсационный все на одной линии, и будет возможно предложить вы могли бы использовать heredoc.

+0

Я получаю '/ bin/sh: -c: строка 1: синтаксическая ошибка: неожиданный конец файла' теперь (после добавления котировок). – Lazer

+1

Это должно быть '/ bin/sh -c ', если ps -ef | зеленое яблоко; затем эхо APPLE; fi'' - конечный ';' не нужен, но ';' после окончания 'echo' и до' fi'. Причина, по которой у вашей многострочной версии не было проблемы, заключается в том, что конец строки используется как неявный ';'. Кроме того, как правило, следует использовать одинарные кавычки для этого, чтобы избежать непреднамеренных расширений. – Sorpigal