Jawaban:
Jawaban yang mudah adalah karena ksh ditulis seperti itu (dan bash kompatibel). Tapi ada alasan untuk pilihan desain itu.
Sebagian besar perintah mengharapkan input teks. Di dunia unix, file teks terdiri dari urutan baris, masing-masing berakhir pada baris baru . Jadi, dalam kebanyakan kasus, baris akhir final diperlukan. Kasus yang sangat umum adalah untuk mengambil output dari perintah dengan susbtitusi perintah, memprosesnya dengan cara tertentu, kemudian meneruskannya ke perintah lain. Substitusi perintah menghapus baris baru; <<<
menempatkan satu kembali.
tmp=$(foo)
tmp=${tmp//hello/world}
tmp=${tmp#prefix}
bar <<<$tmp
Bash dan ksh toh tidak bisa memanipulasi data biner (tidak bisa mengatasi karakter nol), jadi tidak mengherankan bahwa fasilitas mereka diarahkan untuk data teks.
<<<
Sintaks di sini-string sebagian besar hanya untuk kenyamanan, seperti <<
dokumen-dokumen di sini. Jika Anda tidak perlu menambahkan baris baru final, gunakan echo -n
(dalam bash) atau printf
dan saluran pipa.
<<<
diperkenalkan ke dunia Bourne oleh zsh
, bukan ksh
. Dan itu terinspirasi oleh operator serupa di port Unix rc
yang tidak menambahkan karakter baris baru tambahan. Menariknya, =(<<<text)
operator tidak menambahkan baris baru itu di zsh
.
printf
, dll) menghindari baris baru tailing bash
? Seperti @ StéphaneChazelas runcing dimungkinkan di zsh
.
Salah satu skenario di mana praktis untuk memiliki baris baru ditambahkan ke sini-string adalah ketika menggunakan read
perintah ketika set -e
mode aktif. Ingat bahwa set -e
menyebabkan skrip berakhir ketika (lebih atau kurang) menemukan pernyataan yang menghasilkan kode status tidak nol. Pertimbangkan yang read
menghasilkan kode status non-nol ketika menemukan string tanpa baris baru:
#!/bin/bash
set -e
# The following statement succeeds because here-strings append a newline:
IFS='' read -r <<< 'newline appended'
echo 'Made it here'
# The following statement fails because 'read' returns a non-zero status
# code when no newlines are encountered.
printf 'no newline' | IFS='' read -r
echo 'Did not make it here'
Saya pikir itu satu-satunya cara untuk mendapatkan baris baru di akhir-string di sini, bukti:
xxd <<<`echo -ne "a\n"`
Akan terlihat bahwa operator di sini-string menghapus baris baru kecuali mereka diberikan dalam sintaks yang Anda kirimkan.
xxd <<<$(echo a)
.