it-swarm-tr.com

$ (Stuff) ve `stuff` arasındaki fark nedir?

Komut ikamesi için iki sözdizimi vardır: dolar parantezleri ve ters işaretlerle. top -p $(pidof init) ve top -p `pidof init` aynı çıktıyı verir. Aynı şeyi yapmanın iki yolu var mı, yoksa farklılıklar var mı?

270
tshepang

Eski stil backquotes ` ` ters eğik çizgi ve yuvalama işlemlerini biraz farklı yapar. Yeni stil $()( ) arasındaki her şeyi bir komut olarak yorumlar.

echo $(uname | $(echo cat))
Linux

echo `uname | `echo cat``
bash: command substitution: line 2: syntax error: unexpected end of file
echo cat

iç içe geçmiş tırnak işaretleri kaçarsa çalışır:

echo `uname | \`echo cat\``
Linux

ters eğik çizgi eğlenceli:

echo $(echo '\\')
\\

echo `echo '\\'`
\

Yeni stil $() tüm POSIX - uyumlu mermiler için geçerlidir.
mouviciel belirtildiği gibi, eski mermi ` ` eski mermiler için gerekli olabilir.

Teknik bakış açısının yanı sıra, eski tarz ` ` de görsel bir dezavantaja sahiptir:

  • Dikkat edilmesi zor: I like $(program) better than `program`
  • Tek bir alıntıyla kolayca karışır: '`'`''`''`'`''`'
  • Yazmak o kadar kolay değil (belki de klavyenin standart düzeninde bile değil)

(ve SE kendi amacı için ` ` kullanıyorsa, bu yanıtı yazmak acı vericiydi :)

364
wag

Gözlemlediğim bariz fark, $() yuvalayabildiğiniz sırada ters tırnakları yuvalayamayacağınızdır. Belki de her ikisi de eski nedenlerden dolayı mevcuttur. Benzer şekilde, . ve source komutları eşanlamlıdır.

41
balki

$() eski Bourne Kabuğu ile çalışmaz. Ama oldu yıl eski Bourne Shell ile çalıştığımdan beri on yıllardır.

28
mouviciel

Başka bir not, $(), ters çubuk kullanmaktan daha fazla sistem kaynağı kullanır, ancak biraz daha hızlıdır.

nix Shell komut dosyalarına hakim olma 'da Randal K. Michael, "Bir Dosyayı Satır İçi İşlemenin 24 Yolu" adlı bir bölümde bir test yapmıştı.

6
cuonglm

Başkalarının burada söylediklerine eklemek için, satır içi yorumları simüle etmek için ters tırnakları kullanabilirsiniz:

echo foo `# I'm a comment!` bar

Çıktı: foo bar.

Daha fazla bilgi için aşağıdakilere bakın: https://stackoverflow.com/a/12797512 (Bu yazının altındaki yorumlara da dikkat edin.)

5
phk

$() sözdizimi eski bourne Shell ile çalışmaz.
Daha yeni mermilerle ` ` Ve $() eşdeğerdir, ancak $() birden çok komutu iç içe yerleştirmeniz gerektiğinde kullanmak için çok daha uygundur.

Örneğin :

echo $(basename $(dirname $(dirname /var/adm/sw/save )))

yazmak ve hata ayıklamak daha kolaydır:

echo `basename \`dirname \\\`dirname /var/adm/sw/save \\\`\``
1
Emmanuel