Komutlarda `(backquote / backtick) ne anlama geliyor?


159

Aşağıdaki komutla karşılaştım:

sudo chown `id -u` /somedir

ve merak ediyorum: `sembolün anlamı nedir . Mesela yukarıdaki komutun iyi çalışmasına rağmen, aşağıdaki komutun çalışmadığını gördüm:

sudo chown 'id -u' /somedir

Yanıtlar:


199

Bu bir geri tepmedir . Backtick, tırnak işareti değildir. Çok özel bir anlamı var. Geri tepme çubukları arasına yazdığınız her şey, ana komuttan önceki kabuk tarafından değerlendirilir (yürütülür) ( chownörneklerde olduğu gibi ) ve bu yürütmenin çıktısı , bu komutta, tıpkı o yere yazdığınız yerde yazdığınız gibi kullanılır. Komut satırı.

Ne olmuş yani

sudo chown `id -u` /somedir

etkin şekilde çalışır ( kullanıcı kimliğinize bağlı olarak ):

sudo chown 1000 /somedir
  \    \     \     \
   \    \     \     `-- the second argument to "chown" (target directory)
    \    \     `-- your user ID, which is the output of "id -u" command
     \    `-- "chown" command (change ownership of file/directory)
      `-- the "run as root" command; everything after this is run with root privileges

Neden, birçok durumda, geri tepmeler kullanmak iyi bir fikir değildir öğrenmek için bu soruya bir göz atın .

Btw, kelimenin tam anlamıyla bir backtick kullanmak isteseydiniz, örneğin bir dizgede, önüne bir ters eğik çizgi ( \) koyarak onu kaçabilirsiniz .


36
Bu, backtick'leri oldukça iyi açıklıyor, ancak kullanmak $(your expression), $()ifadeleri yerleştirmenize izin verenle aynı şeyi yapmanın daha iyi bir yoludur . örneğin: komutunu cd $(dirname $(type -P touch))içeren dizine cd touch
atacak

11
@KhajaMinhajuddin Yuvalama konusunda kesinlikle haklısınız - yukarıda belirtilen soru ayrıntılı olarak ele alınmaktadır. Ancak $()çoğu durumda kullanmanın iyi bir uygulama olduğunu düşünmeme rağmen, geri tepmeleri daha kötü bir şey yapmaz . Pratik amaçlar için, komut satırına yazmak için çok daha hızlı olduklarını kabul etmek gerekir (dahil olmak üzere en az 5 ile karşılaştırıldığında 2 tuş vuruşu Shift).
rozcietrzewiacz

2
@ rozcietrzewiacz En son söyleyişiniz çoğu klavyede muhtemelen doğrudur, ancak $( )kesinlikle ` `en azından bir Fransız klavyesinde yazmaktan daha kolaydır .
jlliagre

1
@KhajaMinhajuddin Backticks'i yuvalayabilirsiniz, ancak 2. seviye backticks'ten kaçmanız ve 2. seviye nesting'e ihtiyacınız var 3 backticks, 3. seviye nesting 5 backticks, 4. seviye 7, & c.
Justin CB,

66

Buraya birkaç puan daha eklemek istiyorum.

Geri tepme `…`aslında komut değiştirme olarak adlandırılır . Komut ikame işleminin amacı, geri hareket çubuğunun içine yerleştirilen komutu değerlendirmek ve sonucunu gerçek komutun argümanı olarak sunmaktır.

Komut ikame birinin kullandığı $(…)ve diğerinin kullandığı iki yolla yapılabilir `…`. Her ikisi de aynı şekilde çalışır, ancak $(…)biçim modern bir yoldur ve daha fazla netlik ve okunabilirliğe sahiptir.

Ve bu yüzden

sudo chown $(id -u) /somedir

diğerine göre tercih edilebilir.

Burada not etmeniz gereken bir şey daha , bash belgesinde belirtildiği gibi bash alıntı kuralları ile komut değiştirme ilişkisidir .

Eğer ikame çift tırnak içinde belirirse, sonuçlarda kelime bölme ve dosya adı genişletme gerçekleştirilmez.


8
Ayrıca, $(...)daha iyi yuva yapar.
Kusalananda

$()ve "``"aynı şekilde çalışmaz
Kun

10

Bir açıklama notu nadiren ele alınmaktadır:

Geri dönüş vuruşları (bazen Fransızca olarak ve diğer dillerde ortak bir vurgu olarak kullanıldığı için Graves olarak da adlandırılır) yalnızca Standart Çıktının yerini alır , ancak Standart Hata yerine kullanılır.

Yani önceki örneğe devam etmek için:

file `which hostname`

beklendiği gibi çalışacak, ancak:

file `which hostnameX`

whichbir hata döndürür ve bu çıktı yanındaki komut satırına geçmek yerine standart hataya gider file; çalıştırarak onaylayabileceğiniz hiçbir standart çıktı olmayacaktır:

which hostnameX

which hostnameX 2>/dev/null

Bu durumda,

file `which hostnameX` 

iki hata mesajı üretecektir (birincisi, which hostnameXdiğeri hemen hemen ardından diğeri, dosyanın kendisinden dolayı), dosya adının eksik olduğunu tespit eder ve tüm komut

aslında sadece azaltacaktır:

file

ki bu elbette kötü kullanımdır ve bir Kullanım hatası verir.

(Kendiniz kontrol etmek istiyorsanız deneyebilirsiniz:

file `which hostnameX 2>/dev/null`    # just the file-command bad-usage error msg is printed

file `which hostnameX 2>/dev/null` 2>/dev/null  # now nothing is printed on the screen :)

4

Backtick `ekteki dizginin içeriğini çalıştırır, bunun gibi bir şey

file `which hostname`

hostname komutunun yolunu bulur ve daha sonra nasıl oluşturulduğunu söyler.

Sorunuza koyduğunuz komut id -uetkin kullanıcı kimliğini almak için çalışır ve ardından / somedir öğesinin sahipliğini o kullanıcıya değiştirir.


2

Bu sembol, içindeki komutun sonucu olarak yorumlandığı anlamına gelir.

Örneğin:

$ls /home
one two
$pwd
/usr/three
$cp `pwd` /home
$ls /home
one two three

Yukarıdakiler, threedizinin dizime kopyalanmasıyla sonuçlanır /home.


1

Geri tepme komutları yerine geçer. Bu backticks sözdizimi arkaik ve iki parantez yaygındır ile dolar işareti biliyorum: $().

Komut ikame nedir?

Komut değiştirme, hem bir komutu yürütmek hem de çıktısını daha sonra kullanmak üzere bir değişkende saklamak için ayrılmış sözdizimine sahip tek bir işlemdir.

Tarih içeren bir örnek:

thedate=$(date)

Daha sonra sonucu yazdırabiliriz: 'Tarih% s \ n' "$ thedate" `.

  1. Komut ikamesi sözdizimi $().
  2. Komutun kendisi date.
  3. İkisini birleştirerek $(date), çıktısının ikame olduğunu elde ederiz .
  4. printfYukarıdaki komutu kullanarak değişkenin beklettiği çıktı değerini gösteririz .
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.