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
として実行すると、目的の出力が得られます...
echo
の混合履歴は、デフォルトの操作がシェルごとに異なることを意味します。 POSIX 指定 最初の引数が-n
であるか、いずれかの引数にバックスラッシュが含まれている場合、echo
の結果は「実装定義」になります。
printf
(組み込みコマンドまたは外部コマンドとして)を使用する方が信頼性が高く、動作がより明確に定義されています。Cスタイルのバックスラッシュエスケープとフォーマット指定子は次のとおりです。フォーマット文字列(最初の引数)でサポートされています。
printf 'foo\nbar\n'
printf '%s\n%s\n' foo bar
bashのecho
組み込みコマンドのバックスラッシュエスケープシーケンスの展開は、xpg_echo
シェルオプションを使用して制御できます。
bashスクリプトの先頭に設定して、echo
が自動的にバックスラッシュを展開するようにしますすべてのエコーコマンドに-e
を追加せずにエスケープします。
shopt -s xpg_echo
echo 'foo\nbar'
bash myfile.sh
を使用すると、Bashは「バッチ」モードで分離プロセスで実行され、しないはプロファイルまたはrcfileを読み取ります。
. myfile.sh
を使用すると、ファイルは現在のシェルプロセスによってsourcedになるため(コンテンツが入力されたかのように)、現在定義されているエイリアスが表示されます。
一般に、特定のシェル構成に依存するスクリプトを作成することは非常に悪い考えです特にエイリアス(ただし、それらを定義しない限りスクリプトで自体)。 (なし自分のものであっても、ユーザーの.bashrc
に依存します。)
すべての新しいスクリプトで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として実行