0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Macのデフォルトbashとサーバーのbashは挙動が異なることがある

Last updated at Posted at 2025-05-14

概要

今日、シェルスクリプトをサーバーにデプロイしたところ、とある箇所で何故かexit 1で終了してしまうコードがありました。
ローカルMacでは正常に終了することを確認していたので、わからなかったのですが調べて分かったことがあったので記録しておきます。

先に結論

MacOS15.4.1だとbashバージョンが低く(3系)、サーバーにインストールされているbashバージョン(AmazonLinuxやDebian12だと5系)と異なることで挙動が変わるので注意。
bashバージョンがサーバーと異なる場合は、homebrewでbashをインストールして挙動を確認しよう。

MacOSバージョン

  • 15.4.1

コード

set -e で戻り値が0でなければ、終了することを想定しています。
[[]]は正規表現を使うために使用し、正規表現がマッチしなければ終了、マッチしたらechoを実行することを想定しています。

#!/bin/bash

set -e

[[ "hoge" =~ "fuga" ]]

echo 'ok'

Macで実行してみます。

$ /bin/bash -x /tmp/test.sh
+ set -e
+ [[ hoge =~ fuga ]]
+ echo ok
ok

$ echo $?
0

set -e により、戻り値が0以外なら終了するのですが、当該bashでは [[]]の戻り値では判定されず、その後の echoが実行されています。

同一のコードを Debian 12で実行してみます。
※Debian12では/bin/shのシンボリックリンク先が dashだったため、フルパスでbashを指定してます。
※Macも /bin/shbash になっているので注意

$ /bin/bash -x /tmp/test.sh
+ set -e
+ [[ hoge =~ fuga ]]

$ echo $?
1

この通り結果が異なります。

理由

bashのバージョンが異なるためです。
バージョン4系から set -e および [[]] の挙動が異なるようです。
※残念ながら日本語の公式ドキュメントを見つけられず、挙動が変わった正確なバージョンについては不確かです。英語ドキュメントでそれらしい情報があったものの、引用は避けています

Debian

$ /bin/bash --version
GNU bash, バージョン 5.2.15(1)-release (x86_64-pc-linux-gnu)
Copyright (C) 2022 Free Software Foundation, Inc.

Mac(default)

$ /bin/bash --version
GNU bash, version 3.2.57(1)-release (arm64-apple-darwin24)

Mac(homebrew)

$ /opt/homebrew/bin/bash --version
GNU bash, バージョン 5.2.37(1)-release (aarch64-apple-darwin23.4.0)
Copyright (C) 2022 Free Software Foundation, Inc.
$ /opt/homebrew/bin/bash -x /tmp/test.sh
+ set -e
+ [[ hoge =~ fuga ]]

$ echo $?
1

homebrewでインストールしたbashは5系でDebianと同一の挙動になりました。

まとめ

bashバージョンにより、set -e および [[]] の挙動が異なることがわかりました。
homebrewで最新版をインストールすることで、サーバーバージョンに近いバージョンをインストールできるので、homebrewでインストールしておくのが良さそうです。

0
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?