LinuxとmacOSの両方でシェルスクリプトを共有する場合、echo の挙動(特にオプションの解釈)の違いは非常によくある悩みどころです。
手っ取り早い解決策は、printf を使うのが最も確実でポータブルな(環境に左右されない)解決策です。
1. 最もおすすめ: printf を使う
POSIX準拠の printf は、LinuxでもMacでも(あるいはBSDやUnixでも)全く同じように動作します。printf はデフォルトで改行を追加しないため、-n を指定する必要もありません。
printf "create ... "
もし変数を表示したい場合は、以下のように書くのが安全です(変数の内容に % などが含まれていても誤作動しないため)。
printf "%s" "create ... "
2. スクリプト全体で echo -n を多用している場合
すでに多くの場所で echo -n を書いてしまっていて、書き直すのが面倒な場合は、スクリプトの冒頭で独自の出力関数を定義してしまうのがスマートです。
# 改行なしで出力する関数を定義
print_n() {
printf "%s" "$*"
}
# 使い方
print_n "create ... "
なぜ echo -n はMacで動かないことがあるのか?
原因は、利用しているシェル(bash, zshなど)のビルドオプションや、OS標準の /bin/echo の仕様が異なるためです。
- GNU版 (主にLinux):
-nオプションを解釈する。 - BSD版 (主にMac):
-nを解釈するものもあれば、環境によってはそのまま文字列として出力してしまうものがある。 - シェル内蔵版: zshやbashなどのシェル自身が持っている
echoも、設定(shoptなど)によって挙動が変わることがあります。
まとめ
- 新しく書くなら:
printf "メッセージ"を使う。 - 汎用性を高めるなら:
printfを使った自作関数を作る。

コメント