gema karakter baris baru tidak berfungsi di bash

13

Saya memiliki skrip bash yang memiliki banyak echopernyataan dan juga saya alias echountuk echo -ekeduanya di .bash_profiledan .bashrc, sehingga baris baru dicetak dengan benar untuk pernyataan seperti echo 'Hello\nWorld'keluaran harus

Hello
World

tapi output yang saya dapatkan adalah

Hello\nWorld

Saya bahkan mencoba menggunakan shopt -s expand_aliasesdalam skrip, itu tidak membantu

Saya menjalankan skrip saya sebagai bash /scripts/scriptnm.sh; jika saya menjalankannya karena . /scripts/scriptnm.shsaya mendapatkan output yang diinginkan ...

Bashuser
sumber
3
alias echoseperti yang Anda inginkan adalah praktik buruk IMHO
shellholic
1
Gunakan tanda kutip ganda untuk \ n yang ditafsirkan. Kutipan tunggal mencegah interpretasi \ n dan banyak hal lainnya.
BillThor

Jawaban:

16

Sejarah campuran echocara operasi standar bervariasi dari shell ke shell. POSIX menentukan bahwa hasilnya echoadalah "implementasi-didefinisikan" jika argumen pertama adalah -natau argumen apa pun mengandung backslash.

Lebih dapat diandalkan untuk digunakan printf(baik sebagai perintah bawaan atau perintah eksternal) di mana perilaku lebih didefinisikan: backslash C-style lolos dan penentu format didukung dalam string format (argumen pertama).

printf 'foo\nbar\n'
printf '%s\n%s\n' foo bar

Anda dapat mengontrol perluasan urutan escape backslash dari pesta ‘s echobuilt-in perintah dengan xpg_echoopsi shell.

Atur di bagian atas skrip bash untuk membuat echosecara otomatis memperluas backslash lolos tanpa harus menambahkan -eke setiap perintah gema.

shopt -s xpg_echo
echo 'foo\nbar'
Chris Johnsen
sumber
shopt -s xpg_echo; Bekerja untukku.
Bashuser
6

Saat Anda menggunakan bash myfile.sh, Bash dijalankan dalam mode "batch", pada proses yang terpisah , dan tidak membaca profilnya atau rcfile.

Ketika Anda menggunakan . myfile.sh, file tersebut bersumber dari proses shell saat ini (seolah-olah isinya diketik oleh Anda), karena itu ia melihat alias yang saat ini Anda tetapkan.

Secara umum, itu adalah ide yang sangat buruk untuk menulis skrip yang bergantung pada konfigurasi shell tertentu, terutama alias, kecuali jika Anda mendefinisikannya dalam skrip itu sendiri. ( Jangan pernah mengandalkan pengguna .bashrc, meskipun itu milik Anda sendiri.)

pengguna1686
sumber
5

Praktik yang disarankan adalah untuk digunakan printfuntuk semua skrip baru.

printf '%s\n%s\n' "Hello" "World"

printf '%s\n' "Hello\nWorld"
Dijeda sampai pemberitahuan lebih lanjut.
sumber
+1 printf sedikit lebih rumit untuk digunakan daripada gema, tetapi lebih dari hasil dalam menghindari ketidakkonsistenan gema.
Gordon Davisson
1

Ini berfungsi dengan baik di terminal

#!/bin/bash
alias echo="echo -e"
echo "Hello\nWorld"

simpan ke file dan buat itu exeutable (chmod + x) itu

jalankan sebagai ./your_file

LaLeX
sumber
jalankan sebagai bash your_file dan periksa hasilnya.
Bashuser
Bekerja seperti yang diharapkan
LaLeX
tetapi gema "Hello \ nWorld" tidak menampilkan output yang diharapkan. Seperti gema sudah alias gema-seharusnya ia tetapi itu tidak berfungsi dan itu pertanyaan saya
Bashuser
Karena ini adalah praktik yang buruk untuk alias echo (program yang bergantung padanya mungkin rusak), Anda harus menghapus alias dan dalam pencarian skrip Anda untuk echo end gantikan dengan echo -e
LaLeX
Terima kasih banyak LaLex atas jawaban Anda, apakah ada cara agar saya dapat mencapai hasil yang diharapkan dengan alias meskipun bukan praktik yang baik
Bashuser