memorandums

日々の生活で問題解決したこと、知ってよかったことなどを自分が思い出すために記録しています。

brewのインストーラみたいなことをしようとしてハマった...

背景

macで開発している方ならご存知のはずのHomebrew(brewコマンドで使えるので以降はbrewと呼びます)さん。

brew.sh

Linux系のライブラリやコマンドのインストールがとても簡単にできます。

で、このbrewのインストールがなんかかっこいい。以下のコマンドをターミナルにコピペして実行するだけです。

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

いつか真似したいな。。。と思っていたんですが、そんなチャンスはなかなか訪れませんでした。

たまたま、研究ツールをできるだけ間違えずに学生さんにインストールしてもらうためこの仕組みを真似することにしました。

コマンドとかは省略させてもらいますが、githubbrewを真似てinstall.shというのを作りました。そのシェルコマンドを実行すると必要なツールがダウンロードされて配置完了する感じです。ちょっとぼかして書いているのでなんのことやら。。。という感じかもですが。そこが本題ではないので。。。ご容赦ください。

ここからが問題のはじまり

で、上記の「/bin/bash -c "$(curl -fsSL 〜」というコマンドをコピペしてターミナルで実行してもらいます。その場所が大事なので間違った場所で実行しようとするとエラーを吐き出そうとしました。

Bash icon by Icons8

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でした。

早速、ぐぐってみると以下の記事が見つかりました。

stackoverflow.com

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

ねよ。