Ubuntuではデフォルトでは bash でなく dash が使われています。それで困ることはそれほど多くないのですが bash の便利機能(文字列置換や数式評価など)を使いたいときに不便です。
またシェルスクリプトでちゃんとシェバンを書いていないお行儀のわるいのが混じっていたりすると困ってしまいます。Bashism あふれるスクリプトなのにシェバンが「#!/bin/sh」となっていたら殺意すら覚えます。まあスクリプトが2つ3つくらいならいいんですが、AOSPのようにコードだけで数百GBあるようなプロジェクトだともうお手上げです。
今回はまず一般的に解説されているUbuntuのデフォルトのシェルをbashにする方法を説明します。その方法は dpkg-reconfigure を使いますが、この方法はインタラクティブなコマンドなのではスクリプトでは使えません。そこでさらにスクリプトで使える代替の方法も説明します。
ちなみに確認環境は WSL Ubuntu20.04です。
$ lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 20.04.4 LTS Release: 20.04 Codename: focal
簡単な方法
下記のように実行します。
$ sudo dpkg-reconfigure dash
環境や言語設定によって表示が違いますが「dash をデフォルトののシステムシェル(/bin/sh)として使いますか?」という意味のことを聞かれるので「No」「いいえ」を選択します(環境によって「No」と入力する場合も有ります)。
実行したら念の為、/bin/sh を確認します。下記のように bash を指していれば問題ありません。
$ ls -l /bin/sh lrwxrwxrwx 1 root root 4 3月 10 00:31 /bin/sh -> bash
スクリプトでも使える方法
上記の dpkg-reconfigure ですが、No と選択する必要があるためスクリプトでは使えません。ならばと下記のように Yes コマンドを使ってみてもダメでした。
$ yes "no" | sudo dpkg-reconfigure dash
代わりに下記のように実行すれば上記と同じことができます。選択が不要になるのでこのままスクリプトに使えます。
$ echo "dash dash/sh boolean false" | debconf-set-selections $ DEBIAN_FRONTEND=noninteractive dpkg-reconfigure dash
実行後に /bin/sh を確認するとちゃんと bash を指しているはずです。
コマンドの詳細は下記にかいてありました。
Dockerfile での書き方
スクリプトで書けないとDockerfile でも困ってしまいます。Dockerfileでは下記のようにすればOKです。
RUN echo "dash dash/sh boolean false" | debconf-set-selections RUN DEBIAN_FRONTEND=noninteractive dpkg-reconfigure dash
まとめ
Ubuntu(WSL含む)でのデフォルトシェルをBASHに変更する方法を説明しました。一般的に説明のある dpkg-reconfigure ではスクリプトでは使えないのでその代替の方法も説明しました。参考になれば幸いです。
コメント