Echo neden / bin / sh -c echo foo olarak adlandırılmıyor?


15

Ö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:


21

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.


2
Daha katı, standart bir uygun yol olurdush -c 'echo $1' echo foo
jlliagre

1
sh -c 'echo "$@"' fnord a b c d ...
zwol

3
IMHO açıklama oldukça iyiydi, ancak sh -c 'echo $0' fooen 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'
alıntısını

1
@ X3MBoy Soru soran / bin / sh -c 'echo foo' nun iyi çalıştığını zaten biliyor. Ben açıkladım bunun dışında bir şey yankılamak istedi
Ijaz Ahmad Khan

18
$ 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 echove içerir foo bağımsız değişken olarak $0. echoYeni 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

8

Bu komutta:

echo foo

echoikili (veya yerleşik komut) ve fooilk bağımsız değişkendir.

Buraya:

/bin/sh -c echo foo

/bin/sh-cparametresi olarak "komut dizesi" ni kabul eden ilk argümanı olan ikili dosyadır. Bu echoyukarıdaki örnektir. Sonra üçüncü bir argüman var: foobu 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.


3

Yapı sh -c wordyalnı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

Örnekler

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

Sonuç

Yürütülen komutu tırnak işareti kullanarak bir "sözcük" olarak tutun.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.