[コマンド]Macでecho

コマンド
mac マック
コマンド

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 など)によって挙動が変わることがあります。
[コマンド]Macでecho
[ShellCheck]インストールからVim連携
シェルスクリプトのバグや非推奨構文を検知する静的解析ツール「ShellCheck」の導入ガイド。macOSやUbuntuでのインストールから、Vim(ALE/coc.nvim)でのリアルタイム連携、特定の警告を無視する方法まで解説します。

まとめ

  • 新しく書くなら: printf "メッセージ" を使う。
  • 汎用性を高めるなら: printf を使った自作関数を作る。
Q よくある質問 (FAQ)
Q. なぜMacとLinuxでechoの挙動が異なるのですか?
A.
Mac(BSD系)とLinux(GNU系)で採用されている標準コマンドの仕様の違いや、シェル(bashやzsh)の内蔵オプションのビルド設定が異なるためです。
Q. echoの代わりにprintfを使うメリットは何ですか?
A.
printfはPOSIX準拠であるため、OSや環境に依存せず常に同じ挙動をします。また、デフォルトで改行を出力しないため、ポータブルなスクリプトを作成できます。

コメント

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