yankı newline karakteri bash'da çalışmıyor


13

Ben çok var bash betiği echotablolar ve ayrıca takma adlı echoetmek echo -ehem .bash_profileve .bashrcbenzeri yeni hatlar açıklamada düzgün basılır, böylece echo 'Hello\nWorld'çıkış olmalı

Hello
World

ama elde ettiğim çıktı

Hello\nWorld

Hatta shopt -s expand_aliasessenaryoda kullanmayı denedim , yardımcı olmuyor

Senaryomu şöyle çalıştırıyorum bash /scripts/scriptnm.sh; . /scripts/scriptnm.shİstediğim çıktıyı alırken çalıştırırsam ...


3
echoİstediğiniz gibi takma adlandırma kötü bir uygulama IMHO
shellholic

1
\ N yorumlanması için çift tırnak kullanın. Tek tırnak işaretleri \ n ve diğer birçok şeyin yorumlanmasını engeller.
13'te BillThor

Yanıtlar:


16

Karmaşık geçmişi echo, varsayılan işleminin kabuktan kabuğa değiştiği anlamına gelir. POSIX , ilk bağımsız değişken veya herhangi bir bağımsız değişken ters eğik çizgi içeriyorsa sonucunun "uygulama tanımlı" olduğunu belirtir .echo-n

printfDavranışın daha iyi tanımlandığı yerlerde (yerleşik komut veya harici komut olarak) kullanmak daha güvenilirdir : C stili ters eğik çizgi kaçar ve biçim belirteçleri biçim dizesinde (ilk argüman) desteklenir.

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

Sen Ters eğik çizgi kaçış dizilerinin genişlemesini kontrol edebilirsiniz bash ‘s echoyerleşik komutuyla xpg_echokabuk seçeneği.

Her yankı komutuna eklemek zorunda kalmadan otomatik olarak ters eğik çizgi kaçışlarını yapmak için herhangi bir bash betiğinin en üstüne ayarlayın .echo-e

shopt -s xpg_echo
echo 'foo\nbar'

shopt -s xpg_echo; Benim için çalıştı.
Bashuser

6

Kullandığınızda bash myfile.shBash ran bir on, "toplu" modunda ayrı süreç ve gelmez onun profil veya rcfile okuyun.

Kullandığınızda . myfile.sh, dosya geçerli kabuk işlemi tarafından kaynaklanır (içeriği sizin tarafınızdan yazılmış gibi), bu nedenle şu anda tanımlanmış takma adlarınızı görür.

Genel olarak, herhangi bir kabuk yapılandırmasına, özellikle diğer adlara bağlı olan komut dosyalarını , komut dosyasında tanımlamadığınız sürece yazmak Çok Kötü bir Fikirdir . ( Kendinizinkine rağmen asla kullanıcının güvenmeyin .bashrc.)


5

Önerilen uygulama printftüm yeni komut dosyaları için kullanmaktır .

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

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

+1 printf'in kullanımı yankıdan biraz daha karmaşıktır, ancak yankının tutarsızlıklarından kaçınmaktan daha fazlasını yapar.
Gordon Davisson

1

Bu terminalde iyi çalışıyor

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

bir dosyaya kaydedin ve exeutable yapın (chmod + x)

./your_file olarak çalıştır


bunu bas_ dosyanız olarak çalıştırın ve çıktıyı kontrol edin.
Bashuser

Beklendiği gibi çalışıyor
LaLeX

ancak echo "Hello \ nWorld" beklenen çıktıyı göstermiyor. Yankı zaten Yankı'ya aliased -e gerekir ama bu çalışmıyor ve bu benim sorum
Bashuser

Diğer ad echo için kötü bir uygulama olduğu için (buna bağlı programlar kırılabilir) takma adı kaldırmalı ve komut dosyanızda echo end yerine echo -e ile değiştirmelisiniz
LaLeX

Cevaplarınız için çok teşekkürler LaLex, iyi bir uygulama olmasa da takma adla beklenen sonucu elde edebilmemin bir yolu var
Bashuser
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.