Bu komutu çalıştırdığınızda:
ls
terminal, çıktısını görüntüler ls
.
Bu komutu çalıştırdığınızda:
echo $(ls)
kabuk, çıktısını yakalar ve üzerinde sözcük ayırma$(ls)
işlemini gerçekleştirir . Varsayılan olarak , bu, yeni satır karakterleri dahil tüm beyaz boşluk dizilerinin tek bir boşlukla değiştirildiği anlamına gelir . Bu nedenle çıktısı bir satırda gözüküyor.IFS
echo $(ls)
Kelime bölme konusunda ileri düzeyde tartışma için, Greg'in SSS bölümüne bakın .
Kelimenin bölünmesini engelleme
Kabuk, tırnaklarda tırnak içinde sözcük bölme işlemi gerçekleştirmez. Böylece, kelime bölmeyi gizleyebilir ve çok satırlı çıktıyı aşağıdaki şekilde saklayabilirsiniz:
echo "$(ls)"
ls
ve çok satırlı çıktı
ls
Satır başına bazen birden fazla dosya yazdırdığını fark etmiş olabilirsiniz :
$ ls
file1 file2 file3 file4 file5 file6
Çıkışı ls
bir terminale gittiğinde bu varsayılandır . Çıktı doğrudan bir terminale gitmiyorsa ls
, varsayılan değerini her satırda bir dosya olarak değiştirir:
$ echo "$(ls)"
file1
file2
file3
file4
file5
file6
Bu davranış belgelenmiştir man ls
.
Başka bir incelik: komut değiştirme ve izleyen yeni satırlar
$(...)
bir komut ikamesi ve çıkışından satır karakterlerini arka kabuk kaldırır komut ikamesi . Bu normalde farkedilmez, çünkü varsayılan echo
olarak çıktısının sonuna bir yeni satır ekler. Eğer sonundan itibaren bir yeni satır kaybedersem Yani, $(...)
ve aralarından biri kazanmak echo
, herhangi bir değişiklik yoktur. Bununla birlikte, komutunuzun çıktısı yalnızca bir tane eklerken 2 veya daha fazla yeni satır karakteriyle bitiyorsa echo
, çıktınızda bir veya daha fazla yeni satır eksik olacaktır. Örnek olarak, printf
takip eden yeni satır karakterleri oluşturmak için kullanabiliriz . Aşağıdaki komutların her ikisinin de, farklı sayıda yeni satıra rağmen, bir satırın aynı çıktısını ürettiğini unutmayın:
$ echo "$(printf "\n")"
$ echo "$(printf "\n\n\n\n\n")"
$
Bu davranış belgelenmiştirman bash
.
Başka bir sürpriz: yol adı genişlemesi, iki kez
Üç dosya oluşturalım:
$ touch 'file?' file1 file2
Arasındaki farkı dikkate ls file?
ve echo $(ls file?)
:
$ ls file?
file? file1 file2
$ echo $(ls file?)
file? file1 file2 file1 file2
Bu durumda echo $(ls file?)
, dosya glob'u iki kezfile?
genişletilir ve bu da dosya adlarının ve çıktıda iki kez görünmesine neden olur . Bunun nedeni, Jeffiekins'in işaret ettiği gibi, yol adı genişletme işlemi önce kabuk tarafından çalıştırılmadan önce ve sonra tekrar çalıştırılmadan gerçekleştirilir.file1
file2
ls
echo
İkili tırnak işaretleri kullanılırsa, ikinci yol adı genişlemesi engellenebilir:
$ echo "$(ls file?)"
file?
file1
file2