web-dev-qa-db-ja.com

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

echoステートメントがたくさんあるbashスクリプトがあり、echo -e.bash_profileの両方でecho.bashrcにエイリアスしているため、新しい行はecho 'Hello\nWorld'のようなステートメントに対して適切に出力され、出力は

Hello
World

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

Hello\nWorld

スクリプトでshopt -s expand_aliasesを使用してみましたが、役に立ちません

スクリプトをbash /scripts/scriptnm.shとして実行しています。 . /scripts/scriptnm.shとして実行すると、目的の出力が得られます...

13
Bashuser

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

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

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

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

bashスクリプトの先頭に設定して、echoが自動的にバックスラッシュを展開するようにしますすべてのエコーコマンドに-eを追加せずにエスケープします。

shopt -s xpg_echo
echo 'foo\nbar'
16
Chris Johnsen

bash myfile.shを使用すると、Bashは「バッチ」モードで分離プロセスで実行され、しないはプロファイルまたはrcfileを読み取ります。

. myfile.shを使用すると、ファイルは現在のシェルプロセスによってsourcedになるため(コンテンツが入力されたかのように)、現在定義されているエイリアスが表示されます。

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

6
user1686

すべての新しいスクリプトでprintfを使用することをお勧めします。

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

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

これはターミナルで正常に動作します

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

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

./your_fileとして実行

1
LaLeX