2012-04-13 3 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' 
$ 

Wie oben, meinen einfachen if-Anweisung erwartet funktioniert wie bei Zeile für Zeile ausgeführt, sondern gibt mir die folgende Fehlermeldung ausgeführt wird, wenn sh -c mit:-Code nicht mit sh -c arbeiten, sondern arbeitet auf sh direkt

bash: syntax error near unexpected token `then'

Was fehlt mir hier?

+0

Ist dir klar, dass 'grep' sich hier immer selbst anpasst? Was machst du wirklich? – Sorpigal

+0

Dies war ein kleines NOOP-Code-Snippet, das ich verwendet habe, um das Problem zu zeigen. – Lazer

Antwort

2

Ihre interaktive Shell wird den Aufruf über sh -c umgehen. Insbesondere nimmt es alles nach dem Semikolon als eine neue Aussage.

Zitieren Sie alles, was Sie zu /bin/sh z.

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

Ich glaube, Sie auch weitere Semikolons mit abgrenzen müssen gegeben, dass Sie alles auf eine Linie sind Kondensieren und würde vorschlagen, Sie vielleicht ein heredoc nutzen könnten.

+0

Ich bekomme '/ bin/sh: -c: Zeile 1: Syntaxfehler: unerwartetes Ende der Datei' jetzt (nach dem Hinzufügen von Anführungszeichen). – Lazer

+1

Es sollte '/ bin/sh -c 'sein, wenn ps -ef | Grep Apfel; dann echo APPLE; fi'' - das nachgestellte '' '' wird nicht benötigt, aber ';' nach dem Ende von 'echo' und vor' fi' ist. Der Grund, warum Ihre mehrzeilige Version kein Problem hatte, ist, dass das Ende der Zeile als implizites ';' dient. Im Allgemeinen sollte man auch einfache Anführungszeichen verwenden, um unbeabsichtigte Erweiterungen zu vermeiden. – Sorpigal