Bash neden $ (cat file) içindeki \ n dosyasını kaldırıyor?


24

İçinde dosya varsa input.txt:

hello
world
!

Ardından bash komutunu çalıştırmak şunu verir echo $(cat input.txt):

hello world !

Neden ve nasıl dosyada olduğunu, dosyada tam olarak ne olduğunu çıktı olarak düzeltebilirim?

Yanıtlar:


32

Eğer kullanırsan

echo "$(cat input.txt)"

düzgün çalışacak.

Muhtemelen yankı girdisi yeni satırlarla ayrılmıştır ve bunu ayrı komutlar olarak ele alacaktır, böylece sonuç yeni satırlar olmadan olacaktır.


Güzel! Öyleyse $ () ve backticks arasındaki (varsa) fark nedir? (Bu çok telaşlı olduğu için özür dilerim)
Chan-Ho Suh

$ (...) 'ın iç içe geçmesi daha kolay olması dışında, bunlar eşdeğerdir. Her iki durumda da, sonucu alıntılamazsanız, beyaz boşlukta birden fazla argümana dönüştürülür.
James Henstridge

3
Ancak son satırsonu karakteri, çift tırnak içine alınmış olsa bile ihmal edilir. Buna karşılık, Perl'in backtick operatörü, tüm yeni satırlar da dahil olmak üzere komutun çıktısına genişler.
Keith Thompson,

6
@KeithThompson evet, komut değiştirme tüm sondaki yeni satırları çıktıdan kaldırır. Bu, örneğin echo "$(date) something"takip eden yeni çizgiyi tarihin çıktısından çıkarmadan, ekoyu tarih ve aynı şeyi "bir şey" olarak çıkaran bir avantaja sahiptir . Bir dosya veya komut çıktısını "olduğu gibi" saklamanız gerekiyorsa, mapfile ( help mapfile) öğesini read -rd ''ya da bir süre döngüsünü kullanın.
geirha

Herkese teşekkürler :-) Buradaki her yorumdan bir şeyler öğrendim!
Chan-Ho Suh

2

Bash manuel sayfasından alıntı, bölüm Command Substitution:

Katıştırılmış yeni satırlar silinmez, ancak sözcük bölme sırasında kaldırılabilirler.

Biraz daha, aynı bölüm:

Eğer ikame çift tırnak içinde belirirse, sonuçlarda kelime bölme ve yol adı genişlemesi yapılmaz.

Bu yüzden echo "$(cat /etc/passwd)" işe yarıyor.

Ek olarak, POSIX teknik özelliklerine göre bir komutun değiştirilmesinin sondaki yeni satırları kaldırdığına dikkat edilmelidir :

$ echo "$(printf "one\ntwo\n\n\n")"
one
two

Bu nedenle, bir dosyanın üzerinden gönderilmesi $(cat file.txt)izleyen satır sonlarının kaybedilmesine neden olabilir ve tüm dosya bütünlüğünün öncelikli olması sorun olabilir.


2

Yeni satırları, örneğin IFS'yi boş bırakarak koruyabilirsiniz:

$ IFS=
$ a=$(cat links.txt)
$ echo "$a"
link1
link2
link3
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.