Geriye doğru hareketi anlama (`)


35

Komutu deniyorum

$ b=5; echo `$b`;
-bash: 5: command not found

ancak olması gerektiği gibi 5 yazdırmaz. Burada ne özlüyorum?

Komutlarda `(backquote / backtick) ne anlama geliyor? `İçindeki komutları değerlendiren ve çıktılarla değiştiren bir şey gibi görünüyor .


8
İç içe geçmiş yerine koyma işlemlerini yapma olanağınızı kaybedeceğinizden geri tepmeler önerilmemektedir. Insetad, $ (somecommand) tercih edilir. Imho okunabilirliği artırır.
Tommy,

6
@ Tommy, Hayır, geri tepme yuvaları iç içe geçebilir, ancak özellikle çift alıntı yaparken, kaçan bir kabusa dönüşür.
Stéphane Chazelas 22:12

Yanıtlar:


52

Geri tepmeler arasındaki metinler komutun çıktısıyla yerine getirilir ve değiştirilir (izleyen yeni satır karakterleri eksidir ve çıktıda NUL karakterleri olduğunda kabuk davranışlarının değiştiğine dikkat edin). Buna komut yerine koyma denir, çünkü komutun çıktısıyla değiştirilir. Bu nedenle, 5 yazdırmak istiyorsanız, geri dönüş tuşlarını kullanamazsınız, echo "$b"herhangi bir teklif ve kullanımı gibi tırnak işaretleri kullanabilirsiniz echo $b.

Gördüğünüz gibi $b, 5 içerdiğinden, backticks kullanırken bashkomutu çalıştırmaya çalışıyor 5ve böyle bir komut olmadığından hata mesajı veriyor.

Geri tepmelerin nasıl çalıştığını anlamak için şunu çalıştırmayı deneyin:

$ A=`cat /etc/passwd | head -n1`
$ echo "$A"

cat /etc/passwd |head -n1/etc/passwdDosyanın ilk satırını yazdırmalısınız . Fakat geri tepmeler kullandığımızdan, bunu konsolda yazmıyor. Bunun yerine Adeğişkende saklanır . Buna yankılanabilirsin $A. İlk satırın daha verimli yazdırılmasının komut head -n1 /etc/passwdkullandığına dikkat edin, ancak backticks'in içindeki ifadenin basit olması gerekmediğine dikkat çekmek istedim.

Bu yüzden eğer ilk / etc / passwd satırı ise root:x:0:0:root:/root:/bin/bash, ilk komut bash ile dinamik olarak değiştirilecektir A="root:x:0:0:root:/root:/bin/bash".

Bu sözdiziminin Bourne kabuğuna ait olduğunu unutmayın. Alıntı yapmak ve kaçmak, özellikle iç içe geçmeye başladığınızda, hızlı bir şekilde kabus olur. Ksh $(...), artık standardize edilmiş ( POSIX ) ve tüm mermilerle (Unix v9'dan Bourne kabuğu bile) desteklenen alternatifi sundu . Bu nedenle $(...), çok eski Bourne mermilerine taşınabilir olmanız gerekmedikçe bugün yerine kullanmalısınız .

Ayrıca, değişken genişlemede olduğu gibi (yalnızca zsh, yalnızca sözcük bölmede) çıktısı `...`ve $(...)sözcük bölünmesi ve dosya adı oluşturulmasına tabi olduğunu ve bu nedenle genellikle liste bağlamında alıntı yapılması gerektiğini unutmayın.


1
Merhaba @Krzysztof, bu yardımcı olur! "$ b 5 içerdiğinden, bash komutunu 5 çalıştırmak çalışıyor" aradığım tam olarak ne
coolcric

you can use quotation marks, like echo "$b"=> "" özel bir şey yapar mı? Öyle görünüyor echo $bki işe yarayacaktı.
Tootsie Rolls,

@Anita: Genel olarak tırnak işaretleri bazı özel şeyler yapar (özel karakterlerin işlenme şeklini değiştirir - özellikle beyaz boşluklar), ancak bu durumda, çok fazla sorun çıkarmadan düşebilirler. Bunun nedeni, hiçbir özel karakter kullanılmaması ve echokomutun aldığı argüman sayısını önemsememesidir, böylece biçinde bazı boşluklar varsa , birden fazla argüman alır ve yine de bunları yazdırır. Bu, diğer komutlar için geçerli olmayabilir (özellikle değişken ayarlanmadığında), bu yüzden değişkenleri daima tırnak işaretleri içine alma eğilimindeyim.
Krzysztof Adamski

(POSIX)gerçek standarda bir bağlantı olsaydı iyi olurdu.
erikbwork

1
@ erikb85: Bu not benim tarafımdan eklenmedi, ancak önerdiğiniz gibi bağlantıyı düzenledim :)
Krzysztof Adamski

11

Geri tepme tam olarak söylediğinizi yapar. Bir tamsayı için bir değişken ayarladınız. Bu değişkeni backticks'in içine koyduğunuzda, bash komut olarak çalıştırmayı deneyecek. Bu bir komut olmadığından, gördüğünüz hatayı alıyorsunuz.

Yapmak istediğin basitçe:

$ b=5; echo $b

Geri tepmeleri daha iyi anlamak için aşağıdakilerle karşılaştır:

$ b=5; a=`echo $b`; echo $a
  5

8

Adım adım ilerleyerek hattınız bunu açıklamalıdır.

$ b=5; echo `$b`;
  1. değişkeni b5 olarak ayarlar
  2. değerlendirir $b(etkin şekilde çalışır 5)
  3. echoYukarıdaki değerlendirmenin çıktısını alır.

Yani evet, elde ettiğiniz çıktı bekleniyor. Bir değişkenin içeriğini değerlendiriyorsunuz, düşündüğünüz gerçek komutu değil. Geri tepme çubukları içine koyduğunuz her şey, yeni (alt) bir kabukta simplay olarak değerlendirildi (çalıştırıldı).


Merhaba @gertvdijk, gönderiniz için teşekkürler! İçeriğini değerlendirdikten sonra kalanları geri getireceğini düşünüyordum. Bu yüzden, 'b $'
yazısının
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.