Ubuntuのデフォルトシェルをスクリプトから変更する

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 を指しているはずです。

コマンドの詳細は下記にかいてありました。

How to do *dpkg-reconfigure dash* as bash automatically
I want to build a docker image from ubuntu image. It is required to change the default sh from dash to bash manually. (Because it require to install many rpm pa...

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 ではスクリプトでは使えないのでその代替の方法も説明しました。参考になれば幸いです。

コメント