Yanıtlar:
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 .
$()
ç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
).
$( )
kesinlikle ` `
en azından bir Fransız klavyesinde yazmaktan daha kolaydır .
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.
$(...)
daha iyi yuva yapar.
$()
ve "``"
aynı şekilde çalışmaz
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`
which
bir 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 hostnameX
diğ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 :)
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 -u
etkin kullanıcı kimliğini almak için çalışır ve ardından / somedir öğesinin sahipliğini o kullanıcıya değiştirir.
Geri tepme komutları yerine geçer. Bu backticks sözdizimi arkaik ve iki parantez yaygındır ile dolar işareti biliyorum: $()
.
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.
thedate=$(date)
Daha sonra sonucu yazdırabiliriz: 'Tarih% s \ n' "$ thedate" `.
$()
.date
.$(date)
, çıktısının ikame olduğunu elde ederiz .printf
Yukarıdaki komutu kullanarak değişkenin beklettiği çıktı değerini gösteririz .
$(your expression)
,$()
ifadeleri yerleştirmenize izin verenle aynı şeyi yapmanın daha iyi bir yoludur . örneğin: komutunucd $(dirname $(type -P touch))
içeren dizine cdtouch