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 ...


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'

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.)


5

Praktik yang disarankan adalah untuk digunakan printfuntuk semua skrip baru.

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

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

+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


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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.