Zum Beispiel, während dies funktioniert:
$ echo foo foo
Das tut nicht:
$ / bin / sh -c echo foo
Während dies tut:
$ / bin / sh -c 'echo foo; Echo-Leiste foo Bar
Gibt es eine Erklärung?
shell
command-line
arguments
echo
SilverlightFox
quelle
quelle
sh -c 'echo $1' echo foo
sh -c 'echo "$@"' fnord a b c d ...
sh -c 'echo $0' foo
ist nicht die beste Option, unter Berücksichtigung, dass der Fragesteller bereits weiß, dass/bin/sh -c 'echo foo; echo bar'
funktioniert, können Sie einfach mit dem Befehl antworten/bin/sh -c 'echo foo'
Dieser ruft
echo
mit dem Argument foo auf und foo wird gedruckt.Dies ruft die Shell mit dem Argument auf
echo
und liefert foo als Argument$0
. Dasecho
gibt eine neue Zeile aus und Sie verwerfen das foo . Wenn Sie foo ausgeben möchten, geben Sie das Argument an:oder verwenden Sie das angegebene Argument:
In diesem Beispiel
Die Schale ist mit dem Argument aufgerufen ,
echo foo; echo bar
welche Ausgängequelle
In diesem Befehl:
echo
ist die Binärdatei (oder der eingebaute Befehl) undfoo
das erste Argument.Hier:
/bin/sh
ist die Binärdatei, deren erstes Argument ist-c
, die selbst einen "Befehlsstring" als Parameter akzeptiert. Dies istecho
im obigen Beispiel. Dann gibt es ein drittes Argument: Dasfoo
ist ein Argument für/bin/sh
, nicht fürecho
. Deshalb in Ihrem dritten Beispiel:... beide sind gedruckt. Sie haben das Argument zitiert. Also: Das erste Argument ist
-c
, und der Parameter zu diesem Argument ist,'echo foo; echo bar'
der als ein einziges Argument interpretiert wird; als "Befehlszeichenfolge".quelle
Die Struktur
sh -c word
führt nur ein Wort (in einer Shell) aus.Hinzugefügte Wörter bedeuten andere Dinge, wie Argument Null, Eins, Zwei usw .:
Um einen Befehl beizubehalten, der Leerzeichen als ein Wort enthält, muss Folgendes angegeben werden:
Das gibt also alle Argumente aus:
Beispiele
In dem Beispiel, das Sie präsentieren:
/bin/sh -c echo foo
Das erste Wort (nach Optionen) ist dasecho
, was ausgeführt wird. Und ein Echo ohne Text gibt nur eine neue Zeile aus, sonst nichts:Aus diesem Grund erhalten Sie eine leere Zeile.
Wenn Sie das Leerzeichen zitieren, führen Sie "ein Wort" (keine Leerzeichen) aus:
Fazit
Behalten Sie den ausgeführten Befehl in Anführungszeichen als ein "Wort".
quelle