Örneğin, bu çalışırken:
$ echo foo foo
Bu yapmaz:
$ / bin / sh -c yankı foo
Halbuki bu:
$ / bin / sh -c 'yankı foo; echo bar ' foo bar
Bir açıklama var mı?
Örneğin, bu çalışırken:
$ echo foo foo
Bu yapmaz:
$ / bin / sh -c yankı foo
Halbuki bu:
$ / bin / sh -c 'yankı foo; echo bar ' foo bar
Bir açıklama var mı?
Yanıtlar:
itibaren 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
Bu, komutunuzun şöyle olması gerektiği anlamına gelir:
$ sh -c 'echo "$0"' foo
foo
Benzer şekilde:
$ sh -c 'echo "$0 $1"' foo bar
foo bar
Anlayan ilk kısım buydu; ikinci durum basit ve açıklamaya gerek yok sanırım.
sh -c 'echo "$@"' fnord a b c d ...
sh -c 'echo $0' foo
en iyi seçenek değil, sorgulayıcının zaten /bin/sh -c 'echo foo; echo bar'
çalıştığını bildiğini göz önünde bulundurarak , komutun /bin/sh -c 'echo foo'
$ echo foo
foo
Bu foo ve fooecho
argümanıyla çağrılır .
$ /bin/sh -c echo foo
Bu değişken kabuğu çağırır echo
ve içerir foo bağımsız değişken olarak
$0
. echo
Yeni bir satır sonucu ve atın foo . Foo çıktısı almak istiyorsanız , şu argümanı belirtin:
sh -c 'echo foo'
veya sağlanan bağımsız değişkeni kullanın:
sh -c 'echo $0' foo
Bu örnekte
$ /bin/sh -c 'echo foo; echo bar'
foo
bar
Kabuk echo foo; echo bar
çıktı veren argüman ile çağrılır.
foo
bar
Bu komutta:
echo foo
echo
ikili (veya yerleşik komut) ve foo
ilk bağımsız değişkendir.
Buraya:
/bin/sh -c echo foo
/bin/sh
-c
parametresi olarak "komut dizesi" ni kabul eden ilk argümanı olan ikili dosyadır. Bu echo
yukarıdaki örnektir. Sonra üçüncü bir argüman var: foo
bu bir argüman /bin/sh
, değil echo
. Bu yüzden üçüncü örneğinizde:
/bin/sh -c 'echo foo; echo bar'
... her ikisi de basılı. Argümanı alıntıladın. Böylece: ilk argüman -c
, ve bu argümanın parametresi 'echo foo; echo bar'
bütün olarak tek bir argüman olarak yorumlanan parametredir; "komut dizesi" olarak.
Yapı sh -c word
yalnızca sözcüğü çalıştırır (kabukta).
Eklenen kelimeler, argüman sıfır, bir, iki vb.
sh -c word zero one two three
boşlukları olan bir komutu tek kelime olarak tutmak için alıntı yapmak gerekir:
sh -c 'echo fnord' zero one two three
böylece, tüm argümanlar yazdırılır:
$ sh -c 'echo "args=" "$0" "$@"' zero one two three
args = zero one two three
Sunduğunuz örnekte: /bin/sh -c echo foo
İlk kelime (seçeneklerden sonra) echo
, yürütülen şey budur. Ve metin içermeyen bir yankı yalnızca yeni bir satır yazdırır, başka bir şey basmaz:
$ / bin / sh -c yankı foo
Bu yüzden boş bir çizgi elde edersiniz.
Alanı alıntılarsanız, "tek kelime" (boşluk yok) uygulayacaksınız, şöyle:
$ / bin / sh -c echo \ foo foo $ / bin / sh -c "yankı foo" foo $ / bin / sh -c 'yankı foo' foo
Yürütülen komutu tırnak işareti kullanarak bir "sözcük" olarak tutun.
sh -c 'echo $1' echo foo