Komutun ikame edilmesinde iki sözdizimi vardır: dolar-parantez ve geri tepme ile. Çalışan top -p $(pidof init)
ve top -p `pidof init`
aynı çıktıyı verir. Bu iki şeyi aynı şeyi mi yapıyorsunuz, yoksa farklılıklar var mı?
Komutun ikame edilmesinde iki sözdizimi vardır: dolar-parantez ve geri tepme ile. Çalışan top -p $(pidof init)
ve top -p `pidof init`
aynı çıktıyı verir. Bu iki şeyi aynı şeyi mi yapıyorsunuz, yoksa farklılıklar var mı?
Yanıtlar:
Eski stil backquotes ` `
ters eğik çizgi ve iç içe biraz farklı davranır. Yeni tarz $()
, aralarındaki her şeyi ( )
komut olarak yorumluyor .
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ş alıntılar 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 kabukları için geçerlidir . Mouviciel'in işaret ettiği
gibi , eski kabukları için eski tarz gerekli olabilir.` `
Teknik bakış açısının yanı sıra eski tarzın ` `
görsel bir dezavantajı vardır:
I like $(program) better than `program`
'`'`''`''`'`''`'
(ve SE, ` `
kendi amaçları için kullanır , bu cevabı yazan bir acıydı :)
{ }
genellikle "küme parantezi" veya "parantez" olarak adlandırılır en.wikipedia.org/wiki/Braces_(punctuation)#Braces
`
ölü bir anahtardır, bu yüzden bir çift-geri dönüş (genellikle yapabileceğimi unutacağım bir şey) veya o zamanki boşluktan sonra yazmam gerekir. Ağrı.
Benim gözlemlediğim bariz fark, yuva kurarken arka ayakları yuvalayamayacağınız $()
. Belki her ikisi de eski nedenlerden dolayı var. Benzer şekilde, .
ve source
komutları eş anlamlıdır.
source
. Dash bir örnek.
$(...)
ve `...`
(ikincisi kullanımdan kaldırılma) ise standart .
standarttır ancaksource
(t)csh
iç içe geçemezler. Yine (t)csh
de desteklemeyin $(...)
. Yine de destekliyorlar source
(değil .
).
$()
eski Bourne kabuğu ile çalışmaz. Ama olmuştur yıllar eski Bourne kabuğu ile çalıştı beri onlarca yıl.
Başka bir not, $()
backticks kullanmaktan daha fazla sistem kaynağı kullanacak, ancak biraz daha hızlı olacaktır.
In Mastering Unix kabuk komut dosyası Randal K. Michael "Dosya Hattı-Line tarafından Süreç 24 Yolları" adlı bir bölümde bir test yapmıştı.
$()
betiğinizin bir byte'ı kullanıldığından daha büyük olmasını sağlıyor `
(iç içe geçmediğinizi ve içinde ters eğik çizgi kullanmadığınız varsayılarak). Ayrıştırılması daha hızlı olacağı için, kabuklar arasında değişecektir ve bir boru yaratma maliyetinin ve komutun ikame edilmesinin gerektirdiği sürecin çatallanmasının maliyetine kıyasla ihmal edilebilir derecede önemsiz olacaktır.
Burada başkalarının söylediklerini eklemek için satır içi yorumları simüle etmek için geri direkleri kullanabilirsiniz:
echo foo `# I'm a comment!` bar
Çıktısı: foo bar
.
Daha fazla bilgi için aşağıdakilere bakın: https://stackoverflow.com/a/12797512 (Bu yazının altındaki yorumları da not edin .)
$()
Sözdizimi eski Bourne kabuğu ile çalışmayacak.
Yeni kabukları ile ` `
ve $()
eşdeğerdir ancak $()
sen yuva birden komutları gerektiğinde kullanmak ç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 \\\`\``