Apakah ada cara untuk membuat bash tidak makan baris baru di substitusi backtick?
Sebagai contoh:
var=`echo line one && echo line two`
echo $var
line one line two
Yang saya inginkan adalah
var=`echo line one && echo line two` # plus some magic
echo $var
line one
line two
bash
ekspansi Melakukan parameter sebelum mengeksekusi perintah, mengutip diperlukan untuk menginformasikanbash
bahwa Anda ingin mencetak string tunggal dan tidak 4 kata-kata (line
,one
,line
dantwo
). Coba:echo a <many spaces> b
danecho "a <many spaces> b"
. Lihatlah jawaban ini juga.Meskipun @cyrus benar - sebenarnya tidak menjawab seluruh pertanyaan, dan tidak ada penjelasan tentang apa yang terjadi.
Jadi mari kita berjalan melewatinya.
Baris baru dalam string
Pertama tentukan urutan byte yang diharapkan:
Sekarang, gunakan Substitusi Perintah (Bagian 3.5.4) untuk mencoba menangkap urutan byte ini:
Kemudian, lakukan gema sederhana untuk memverifikasi urutan byte:
Jadi sepertinya baris baru pertama diganti dengan spasi, dan baris baru kedua dibiarkan utuh. Tapi kenapa ?
Mari kita lihat apa yang sebenarnya terjadi di sini:
Pertama, bash akan melakukan Shell Parameter Expansion (Bagian 3.5.3)
Kemudian bash akan melakukan Word Splitting (Bagian 3.5.7)
Selanjutnya, bash akan memperlakukannya sebagai Perintah Sederhana (Bagian 3.2.1)
Definisi kosong (Bagian 2 - Definisi)
Akhirnya, bash memanggil perintah internal echo (Bagian 4.2 - Bash Builtin)
Jadi untuk meringkas, baris baru dihapus oleh Word Splitting, dan kemudian gema mendapat 2 argumen, "a", dan "b", dan kemudian output mereka dipisahkan oleh spasi dan diakhiri dengan baris baru.
Melakukan apa yang disarankan @cyrus (dan menekan baris baru dari echo dengan -n) hasilnya lebih baik:
Baris baru di akhir string
Ini masih belum sempurna, baris baru yang tertinggal hilang. Melihat lebih dekat pada Substitusi Perintah (Bagian 3.5.4) :
Sekarang sudah jelas mengapa baris baru hilang, bash bisa dibodohi untuk menjaganya. Untuk melakukan ini, tambahkan string tambahan ke bagian akhir, dan hapus ketika menggunakan variabel:
TL; DR
Tambahkan bagian ekstra ke akhir output, dan kutip variabel:
sumber
Saya akan menambahkan tambahan kecil saya di komentar pada jawaban cYrus, tapi saya belum bisa mengomentari jawaban yang saya pikir. Jadi saya akan menduplikasi sebagian cYrus jawabannya untuk kelengkapan.
Apa yang terjadi di baris pertama kode Anda adalah bahwa memang substitusi backticks memakan baris baru yang tertinggal dari output dari perintah yang diganti, seperti yang didokumentasikan . Tapi itu tidak memakan garis baru di antara dua baris Anda.
Apa yang terjadi pada baris kode kedua adalah bahwa echo dieksekusi dengan dua argumen, baris pertama dan kedua. Mengutip variabel yang diperluas akan memperbaikinya:
echo "$var"
Ini akan mempertahankan baris baru antara baris satu dan baris dua. Danecho
akan menambahkan trailing newline secara default sehingga semuanya baik-baik saja.Sekarang jika Anda ingin mempertahankan semua baris baru yang tertinggal di output dari beberapa substitusi perintah, solusinya adalah menambahkan baris lain pada output, yang dapat Anda hapus setelah substitusi perintah, lihat di sini .
sumber