Ubuntuではデフォルトでは bash でなく dash が使われています。 スクリプトから bashに変更できる方法を説明します。


背景

Ubuntuはデフォルトシェルが dashで、それで困ることはそれほど多くないのですが bash が好きな方もいるかと思います。 また、ちゃんとシェバンを書いていないお行儀の悪いスクリプトがいたりすると困ってしまいます。 Bashism あふれるスクリプトなのにシェバンが #!/bin/sh となっていたら殺意すら覚えます。

そこで今回は、まず一般的に解説されているUbuntuのデフォルトのシェルをbashにする方法を説明します。 その方法は dpkg-reconfigure を使いますが、この方法はインタラクティブなコマンドなのではスクリプトでは使えません。 そこでさらにスクリプトで使える代替の方法も説明します。

ちなみに確認環境は WSL Ubuntu20.04です。

1
2
3
4
5
6
$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 20.04.4 LTS
Release:        20.04
Codename:       focal

簡単な方法

下記のように実行します。

1
sudo dpkg-reconfigure dash

環境や言語設定によって表示が違いますが「dash をデフォルトのシステムシェル(/bin/sh)として使いますか?」という意味のことを聞かれるので「No」「いいえ」を選択します(環境によって「No」と入力する場合もあります)。 実行したら念のため、/bin/sh を確認します。下記のように bash を指していれば問題ありません。

1
2
$ ls -l /bin/sh
lrwxrwxrwx 1 root root 4  3月 10 00:31 /bin/sh -> bash

スクリプトでも使える方法

上記の dpkg-reconfigure ですが、No と選択する必要があるためスクリプトでは使えません。ならばと下記のように Yes コマンドを使ってみてもダメでした。

1
yes "no" | sudo dpkg-reconfigure dash

代わりに下記のように実行すれば上記と同じことができます。選択が不要になるのでこのままスクリプトに使えます。

1
2
echo "dash dash/sh boolean false" | debconf-set-selections
DEBIAN_FRONTEND=noninteractive dpkg-reconfigure dash

実行後に /bin/sh を確認するとちゃんと bash を指しているはずです。 コマンドの詳細は下記にかいてありました。 https://superuser.com/questions/715722/how-to-do-dpkg-reconfigure-dash-as-bash-automatically

Dockerfile での書き方

スクリプトで書けないと Dockerfile でも困ってしまいます。Dockerfile では下記のようにすればOKです。

1
2
RUN echo "dash dash/sh boolean false" | debconf-set-selections
RUN DEBIAN_FRONTEND=noninteractive dpkg-reconfigure dash

まとめ

Ubuntu(WSL含む)でのデフォルトシェルを bash に変更する方法を説明しました。 一般的に使われている dpkg-reconfigure はスクリプトでは使えないのでその代替の方法も説明しました。 参考になれば幸いです。