İç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?
İç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:
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.
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.
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.
Yeni satırları, örneğin IFS'yi boş bırakarak koruyabilirsiniz:
$ IFS=
$ a=$(cat links.txt)
$ echo "$a"
link1
link2
link3