エコー改行文字がbashで機能しない


13

私は多くのechoステートメントを持っているbashスクリプトを持っています。また、との両方にエイリアスechoを設定echo -e.bash_profileている.bashrcのでecho 'Hello\nWorld'、出力のようにステートメントに対して新しい行が適切に印刷されます

Hello
World

しかし、私が得ている出力は

Hello\nWorld

私もshopt -s expand_aliasesスクリプトで使用しようとしましたが、それは役に立ちません

スクリプトを次のように実行していますbash /scripts/scriptnm.sh. /scripts/scriptnm.sh目的の出力を取得しているときに実行すると...


3
エイリアシングechoあなたが望むようには悪い習慣の私見である
shellholic

1
\ nが解釈されるように二重引用符を使用します。一重引用符は、\ nの解釈やその他のことを防ぎます。
BillThor

回答:


16

の混合履歴echoは、そのデフォルト操作がシェルごとに異なることを意味します。POSIX は、最初の引数がバックスラッシュを含むか、いずれかの引数がバックスラッシュを含む場合、結果が「実装定義」であることを指定します。echo-n

printf動作がより明確に定義されている場合、(組み込みコマンドまたは外部コマンドとして)使用する方が信頼性が高くなります。Cスタイルのバックスラッシュエスケープと書式指定子が書式文字列(最初の引数)でサポートされます。

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

shellオプションを使用して、bashecho組み込みコマンドのバックスラッシュエスケープシーケンスの展開を制御できxpg_echoます。

すべてのエコーコマンドに追加することなく、バックスラッシュエスケープを自動的に展開するには、bashスクリプトの先頭に設定echoします-e

shopt -s xpg_echo
echo 'foo\nbar'

shopt -s xpg_echo; 私のために働いた。
バシュユーザー

6

を使用するとbash myfile.sh、Bashは「バッチ」モードで別のプロセスで実行され、そのプロファイルまたはrcfileを読み取りません

を使用する. myfile.shと、ファイルは現在のシェルプロセスから取得され(その内容がユーザーによって入力されたかのように)、現在定義されているエイリアスが表示されます。

一般に、スクリプト自体定義しない限り、特定のシェル構成、特にエイリアスに依存するスクリプトを記述するのは非常に悪い考えです。(決してユーザーのに頼っていない、それはあなた自身だ場合でも、。).bashrc



1

これは端末で正常に動作します

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

ファイルに保存して実行可能にします(chmod + x)

./your_fileとして実行


bash your_fileとして実行し、出力を確認します。
バシュユーザー

期待どおりに動作
LaLeX

ただし、エコー「Hello \ nWorld」には期待される出力が表示されません。エコーはすでにエコー-eそれが必要にエイリアスされるが、それは動作していないと私の質問のthatsのよう
Bashuser

それは(それに依存するプログラムが壊れる場合があります)エイリアスエコーに悪い習慣だので、あなたはエイリアスを削除し、エコー終わりのためのスクリプトの検索にエコー-eでそれを置き換える必要があります
LaLeX

あなたの答えのおかげでたくさんLaLex、それは良い習慣ではないですが、私は別名で期待される結果を達成できること方法がある
Bashuser
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.