[コマンド]Macでecho

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 を使った自作関数を作る。

コメント

タイトルとURLをコピーしました