Na przykład, podczas gdy to działa:
$ echo foo bla
To nie:
$ / bin / sh -c echo foo
Podczas gdy to:
$ / bin / sh -c 'echo foo; pasek echa ” bla bar
Czy jest jakieś wytłumaczenie?
Na przykład, podczas gdy to działa:
$ echo foo bla
To nie:
$ / bin / sh -c echo foo
Podczas gdy to:
$ / bin / sh -c 'echo foo; pasek echa ” bla bar
Czy jest jakieś wytłumaczenie?
Odpowiedzi:
Od 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
Oznacza to, że twoje polecenie powinno wyglądać tak:
$ sh -c 'echo "$0"' foo
foo
Podobnie:
$ sh -c 'echo "$0 $1"' foo bar
foo bar
To była pierwsza część do zrozumienia; drugi przypadek jest prosty i chyba nie wymaga wyjaśnienia.
sh -c 'echo "$@"' fnord a b c d ...
sh -c 'echo $0' foo
nie jest najlepszą opcją, biorąc pod uwagę, że pytający już wie, że /bin/sh -c 'echo foo; echo bar'
działa, możesz po prostu odpowiedzieć, cytując polecenie/bin/sh -c 'echo foo'
$ echo foo
foo
Wywoływane jest to echo
z argumentem foo i foo .
$ /bin/sh -c echo foo
To wywołuje powłokę z argumentem echo
i dostarcza foo jako argument
$0
. echo
Wyprowadza nową linię i wyrzucić foo . Jeśli chcesz wypisać foo , zacytuj argument:
sh -c 'echo foo'
lub użyj podanego argumentu:
sh -c 'echo $0' foo
W tym przykładzie
$ /bin/sh -c 'echo foo; echo bar'
foo
bar
Powłoka jest wywoływana z argumentem echo foo; echo bar
wyjściowym
foo
bar
W tym poleceniu:
echo foo
echo
jest plikiem binarnym (lub wbudowanym) i foo
jest pierwszym argumentem.
Tutaj:
/bin/sh -c echo foo
/bin/sh
to plik binarny, którego pierwszym argumentem jest -c
, który sam przyjmuje „ciąg polecenia” jako parametr. To jest echo
w powyższym przykładzie. Jest jeszcze trzeci argument: foo
który jest argumentem za /bin/sh
, a nie za echo
. Dlatego w trzecim przykładzie:
/bin/sh -c 'echo foo; echo bar'
... oba są drukowane. Zacytowałeś argument. Zatem: pierwszym argumentem jest -c
, a parametrem tego argumentu 'echo foo; echo bar'
jest interpretowany jako jeden argument; jako „ciąg poleceń”.
Struktura sh -c word
wykonuje tylko słowo (w powłoce).
Dodane słowa oznaczają inne rzeczy, takie jak argument zero, jeden, dwa itd .:
sh -c word zero one two three
aby zachować polecenie zawierające spacje jako jedno słowo, konieczne jest cytowanie:
sh -c 'echo fnord' zero one two three
więc wypisuje wszystkie argumenty:
$ sh -c 'echo "args=" "$0" "$@"' zero one two three
args = zero one two three
W prezentowanym przykładzie: /bin/sh -c echo foo
Pierwsze słowo (po opcjach) to to echo
, co jest wykonywane. I echo bez tekstu wypisze tylko nowy wiersz, nic więcej:
$ / bin / sh -c echo foo
Dlatego dostajesz pustą linię.
Cytując spację, wykonasz „jedno słowo” (bez spacji), ponieważ:
$ / bin / sh -c echo \ foo bla $ / bin / sh -c "echo foo" bla $ / bin / sh -c 'echo foo' bla
Zachowaj wykonane polecenie jako jedno „słowo”, używając cudzysłowu.
sh -c 'echo $1' echo foo