背景
macで開発している方ならご存知のはずのHomebrew(brewコマンドで使えるので以降はbrewと呼びます)さん。
Linux系のライブラリやコマンドのインストールがとても簡単にできます。
で、このbrewのインストールがなんかかっこいい。以下のコマンドをターミナルにコピペして実行するだけです。
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
いつか真似したいな。。。と思っていたんですが、そんなチャンスはなかなか訪れませんでした。
たまたま、研究ツールをできるだけ間違えずに学生さんにインストールしてもらうためこの仕組みを真似することにしました。
コマンドとかは省略させてもらいますが、githubにbrewを真似てinstall.shというのを作りました。そのシェルコマンドを実行すると必要なツールがダウンロードされて配置完了する感じです。ちょっとぼかして書いているのでなんのことやら。。。という感じかもですが。そこが本題ではないので。。。ご容赦ください。
ここからが問題のはじまり
で、上記の「/bin/bash -c "$(curl -fsSL 〜」というコマンドをコピペしてターミナルで実行してもらいます。その場所が大事なので間違った場所で実行しようとするとエラーを吐き出そうとしました。
bashですのでbashで表示とくればechoですね。以下のような感じでエラーメッセージを表示するようにしました。
echo "コマンドを実行する場所が間違っています"
とりあえずエラーが出ることを確認したのですが、どうせならいかにもエラーが出ているとわかるように赤文字にしようと考えました。調べると、以下のように変えればいいと。
echo -e "\e[31mエラー:コマンドを実行する場所が間違っています\e[m"
ターミナルで実行すると確かに赤表示になるのでわかりやすそうです。
で、これをgithubに配置して「/bin/bash -c "$(curl -fsSL 〜」で実行すると。。。どういうわけか赤文字になりません。30分くらいあーでもないこーでもないとやっていました。
結局なんだったのか?
赤表示に成功したときは「bash install.sh」とやっていました。つまり、bashと/bin/bashが違うことが原因でした。
bashの実体は/opt/homebrew/bin/bashでした。/bin/bashは/bin/bashですね。で、両方のバージョンが違っていたんです。
/opt/homebrew/bin/bashは5.2.15、/bin/bashは3.2.57でした。
早速、ぐぐってみると以下の記事が見つかりました。
There are several apparent bugs in the implementation of echo -e in bash 3.2.x, which is what ships with Mac OS X. The documentation claims that \E (not \e) represents ESC, but neither appears to work. You can use printf instead:
Macにデフォルトで入っているbash 3.2.xでは、エスケープシーケンスを有効化するecho -eにバグがあるんだとか。。。なので、このバージョンのbashを使うときにはprintfコマンドを使いなさい、とのことでした。
ということで以下のように変更すると「/bin/bash -c "$(curl -fsSL 〜」でもちゃんと赤文字でエラー表示されましたとさ。
printf "\e[31mエラー:コマンドを実行する場所が間違っています\e[m"
人に歴史あり、じゃなくてbashに歴史あり、という感じでした。
僕の1時間くらい返しておくれ。。。orz
ねよ。