Yanıtlar:
`date` sadece date
komutun çıktısına genişler . Bununla birlikte, çıktıda birden fazla ardışık boşluk karakteri bulunan yerlerde fazladan boşluk karakterleri kaldırır. (Bunun nedeni, komut değiştirme işleminin kelime bölmeye tabi olması ve echo
komutun çoklu argümanları nasıl ele alması nedeniyle olmasıdır .)
In "` date`" onlar değişkenleri genişletmek ( "$ PWD" deneyin) ve komut ikamesi yapacak bu nedenle, çift tırnak, zayıf tırnaklar vardır. Genleşme sonucu olarak geçirilen bir argüman echo
dahil herhangi bir ardışık alanlar ile, komut: olup, kelime bölme edilir değildir gerçekleştirilir.
In '`date`' onlar içlerinde değişkenleri veya komut ikamesi genişlemesine izin vermez, böylece tek tırnak, güçlü alıntılar var.
Daha fazla açıklama için bu bağlantıya bakın .
İlk yorumu , Michael Suelmann'ın aşağıdaki açıklamada gösterildiği gibi doğru bir şekilde düzenledi .
date
komutla aynı şeyi verir .
Her ikisi de
echo `date`
ve
echo "`date`"
tarihi gösterecektir. İkincisinin çıktısı, çıkışın date
kendiliğinden çalışmasına benziyor .
Yine de, bir fark var: "
alıntılarla çevrili olan tek bir argüman olarak "
gönderilecek echo
. Tırnaklar, tüm komutun çıktısını tek bir argüman olarak içerir. Yana echo
sadece aradaki boşluklarla, sırayla kendi argümanları yazdırır, temelde aynı görünür.
İşte ince farkın bir örneği:
echo `date`
üretir:
Fri Nov 1 01:48:45 EST 2013
fakat:
echo "`date`"
üretir:
Fri Nov 1 01:48:49 EST 2013
Sonrasında iki boşluğun Nov
tırnak işaretleri olmadan bir kısaltılmış olduğuna dikkat edin. Bunun nedeni, kabuğun boşlukla ayrılmış her öğeyi ayrıştırması ve sonucu 6 bağımsız değişken olarak yankıya göndermesidir. Alıntı yaptığınızda, yankı tek bir argüman alır ve tırnaklar alanı korur.
Bu, yankı dışındaki komutlarda çok daha önemli hale gelir. Örneğin, foo
iki argüman isteyen bir komut düşünün : bir tarih ve bir e-posta adresi.
Bu, bu senaryoda işe yarayacaktır:
foo "`date`" joeuser@example.com
Fakat bu senaryoyu 7 argüman göndererek karıştırır:
foo `date` joeuser@example.com
POSIX mermilerinde, `date`
eski komut ikame şeklidir. Modern sözdizimi $(date)
.
Her iki durumda da date
(çıkışın NUL karakterleri içermemesi koşuluyla) izlenen son satırdaki yeni karakterlerin çıktısına kadar genişler .
Bununla birlikte, çift tırnak içinde ve liste içeriğinde olmadığında (örneğin; echo
, sizin durumunuzdaki ) olmadığı zaman, bu genişleme aşağıdakilere de tabidir:
Kelime bölme : " date
izlenen satır sonundaki yeni satır karakterlerinin çıktısı " , $IFS
değişkenin geçerli değerine göre (varsayılan olarak boşluk, sekme ve yeni satır (ve NUL zsh
)) bölünerek kelimeye .
Örneğin, eğer date
çıkışları Fri 1 Nov 14:11:15 GMT 2013\n
(genellikle bir İngiliz yerel ayarda ve bir anakara İngiliz saat diliminde yaptığı gibi) ve $IFS
şu anda içeren :
, yani 3 içine bölünmüş olacaktır deyişle : Fri 1 Nov 14
,11
ve 15 GMT 2013
.
zsh
): (olduğunu, yukarıdaki bölme kaynaklanan her kelime joker karakterler için aranır *
, ?
, [...]
bazı kabukları fazlasına sahip olsa da) ve bu kalıplarla eşleşen dosya adları listesine genişletti. Örneğin, çıkış ise date
ise ?%? 33 */*/* UVC 3432
(genellikle Venüs yerel ve UVC saat diliminde olduğu gibi) ve $IFS
) varsayılan değerdir, o herkese genişlediğinde olmayan gizli olan orta karakterdir geçerli dizinde 3 karakter dosya adları %
, 33
, geçerli dizindeki tüm gizlenmemiş alt dizinlerin gizlenmemiş alt dizinlerindeki tüm gizlenmeyen dosyalar,UVC
ve 3432
.Bu yüzden:
$IFS
üzerinde bölmek istediğiniz karaktere.set +f
devre dışı bırakmak içinTek tırnak her şeyden alıntı yapar, bu nedenle backtick karakterlerinin tam anlamıyla alınmasına neden olur.
Örnek (kullanmak -x
, neler olup bittiğini görmeyi kolaylaştırır):
$ bash --norc -x
bash-4.2$ IFS=:
+ IFS=:
bash-4.2$ echo `date`
++ date
+ echo 'Fri 1 Nov 14' 42 '33 GMT 2013'
Fri 1 Nov 14 42 33 GMT 2013
bash-4.2$ echo "`date`"
++ date
+ echo 'Fri 1 Nov 14:42:41 GMT 2013'
Fri 1 Nov 14:42:41 GMT 2013
bash-4.2$ cd /lib/modules
+ cd /lib/modules
bash-4.2$ export TZ=UVC LC_ALL=vs_VS
+ export TZ=UVC LC_ALL=vs_VS
+ TZ=UVC
+ LC_ALL=vs_VS
bash-4.2$ unset -v IFS # get the default behaviour
+ unset -v IFS
bash-4.2$ echo `date`
++ date
+ echo '?%?' 33 3.10-2-amd64/build/arch 3.10-2-amd64/build/include 3.10-2-amd64/build/Makefile 3.10-2-amd64/build/Module.symvers 3.10-2-amd64/build/scripts 3.10-2-amd64/kernel/arch 3.10-2-amd64/kernel/crypto 3.10-2-amd64/kernel/drivers 3.10-2-amd64/kernel/fs 3.10-2-amd64/kernel/lib 3.10-2-amd64/kernel/mm 3.10-2-amd64/kernel/net 3.10-2-amd64/kernel/sound 3.10-2-amd64/source/arch 3.10-2-amd64/source/include 3.10-2-amd64/source/Makefile 3.10-2-amd64/source/scripts 3.10-2-amd64/updates/dkms 3.10-3-amd64/build/arch 3.10-3-amd64/build/include 3.10-3-amd64/build/Makefile 3.10-3-amd64/build/Module.symvers 3.10-3-amd64/build/scripts 3.10-3-amd64/kernel/arch 3.10-3-amd64/kernel/crypto 3.10-3-amd64/kernel/drivers 3.10-3-amd64/kernel/fs 3.10-3-amd64/kernel/lib 3.10-3-amd64/kernel/mm 3.10-3-amd64/kernel/net 3.10-3-amd64/kernel/sound 3.10-3-amd64/source/arch 3.10-3-amd64/source/include 3.10-3-amd64/source/Makefile 3.10-3-amd64/source/scripts 3.10-3-amd64/updates/dkms UVC 3432
?%? 33 3.10-2-amd64/build/arch 3.10-2-amd64/build/include 3.10-2-amd64/build/Makefile 3.10-2-amd64/build/Module.symvers 3.10-2-amd64/build/scripts 3.10-2-amd64/kernel/arch 3.10-2-amd64/kernel/crypto 3.10-2-amd64/kernel/drivers 3.10-2-amd64/kernel/fs 3.10-2-amd64/kernel/lib 3.10-2-amd64/kernel/mm 3.10-2-amd64/kernel/net 3.10-2-amd64/kernel/sound 3.10-2-amd64/source/arch 3.10-2-amd64/source/include 3.10-2-amd64/source/Makefile 3.10-2-amd64/source/scripts 3.10-2-amd64/updates/dkms 3.10-3-amd64/build/arch 3.10-3-amd64/build/include 3.10-3-amd64/build/Makefile 3.10-3-amd64/build/Module.symvers 3.10-3-amd64/build/scripts 3.10-3-amd64/kernel/arch 3.10-3-amd64/kernel/crypto 3.10-3-amd64/kernel/drivers 3.10-3-amd64/kernel/fs 3.10-3-amd64/kernel/lib 3.10-3-amd64/kernel/mm 3.10-3-amd64/kernel/net 3.10-3-amd64/kernel/sound 3.10-3-amd64/source/arch 3.10-3-amd64/source/include 3.10-3-amd64/source/Makefile 3.10-3-amd64/source/scripts 3.10-3-amd64/updates/dkms UVC 3432
bash-4.2$ echo "`date`"
++ date
+ echo '?%? 33 */*/* UVC 3432'
?%? 33 */*/* UVC 3432
Çıktı NUL karakterleri içeriyorsa, davranış kabuktan kabuğa değişir: bazıları bunları kaldırır, bazıları çıktıyı ilk NUL karakterinde keser, zsh
korur , ancak yine de harici komutların NUL'ları içeren argümanları alamayacağını unutmayın.
`Date` ile tarihin çıktısını birden fazla kelimeye alırsınız, çünkü kelime bölmesi komutun yerine getirilmesinden sonra yapılır.
"` Date` "ile tarihin çıktısını tek bir kelime / parametre olarak elde edersiniz, çünkü çift tırnak işaretleri arasında komut ikamesi vardır, ancak çıktı daha fazla ayrıştırılmaz. Aynısı, aşağıdaki örneğindeki "$ i" gibi değişken genişleme için de geçerlidir.
'`Date`' 'ile tam anlamıyla bir` date` elde edersiniz, çünkü tek tırnaklar arasında komut değişikliği yoktur.
Belki de 3 formun farklılıkları bu şekilde daha belirgin olacaktır:
> for i in `date`; do echo "$i"; done
Fr
1.
Nov
12:25:30
CET
2013
> for i in "`date`"; do echo "$i"; done
Fr 1. Nov 12:25:38 CET 2013
> for i in '`date`'; do echo "$i"; done
`date`