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?
shell
command-line
arguments
echo
SilverlightFox
źródło
źródło
sh -c 'echo $1' echo foo
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'
Wywoływane jest to
echo
z argumentem foo i 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:lub użyj podanego argumentu:
W tym przykładzie
Powłoka jest wywoływana z argumentem
echo foo; echo bar
wyjściowymźródło
W tym poleceniu:
echo
jest plikiem binarnym (lub wbudowanym) ifoo
jest pierwszym argumentem.Tutaj:
/bin/sh
to plik binarny, którego pierwszym argumentem jest-c
, który sam przyjmuje „ciąg polecenia” jako parametr. To jestecho
w powyższym przykładzie. Jest jeszcze trzeci argument:foo
który jest argumentem za/bin/sh
, a nie zaecho
. Dlatego w trzecim przykładzie:... 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ń”.źródło
Struktura
sh -c word
wykonuje tylko słowo (w powłoce).Dodane słowa oznaczają inne rzeczy, takie jak argument zero, jeden, dwa itd .:
aby zachować polecenie zawierające spacje jako jedno słowo, konieczne jest cytowanie:
więc wypisuje wszystkie argumenty:
Przykłady
W prezentowanym przykładzie:
/bin/sh -c echo foo
Pierwsze słowo (po opcjach) to toecho
, co jest wykonywane. I echo bez tekstu wypisze tylko nowy wiersz, nic więcej:Dlatego dostajesz pustą linię.
Cytując spację, wykonasz „jedno słowo” (bez spacji), ponieważ:
Wniosek
Zachowaj wykonane polecenie jako jedno „słowo”, używając cudzysłowu.
źródło