NixOS は実行バイナリのインストールパスが独特なため、Ubuntu を想定して書かれているシェルスクリプトなどが動かないことがよくあります。例えば shebang が #!/usr/bin/bash になっていたり、そもそもスクリプト中に apt install や apt upgrade が埋め込まれていたりというケースです。もちろん正攻法としては、前者は #!/usr/bin/env bash に書き換えたり、後者は Nix Flake の管理に置き換えたりすれば NixOS でも動くようになるのですが、それなりに手間もかかりますし面倒です。
このような時は Distrobox が便利です。Distrobox はコンテナを使って仮想的に好きな Linux distro を立ち上げられる仕組みで、通常の Docker などと異なりホームディレクトリなどが自動的にシェアされるという特長があります。これを使って Ubuntu を立ち上げスクリプトを動かすことができます。
Distrobox のインストールや立ち上げ方などは NixOS Wiki に詳しいですが、要するに以下のようにコマンドを打つと Ubuntu の環境が立ち上がります。
distrobox create --name ubuntu2404 --image ubuntu:24.04
そのうえで distrobox enter ubuntu2404 を実行するとシェルに入れるので、ここからコマンドを実行することになります。
ただし、いちいちシェルに入るのは面倒なので、以下のような小さなスクリプトを用意しておくと便利です。
#!/usr/bin/env bash
set -xeu -o pipefail
# 追加で PATH を通したい場合に備えて冗長な書き方をしている。
distrobox enter ubuntu2404 -- bash -c 'exec env PATH="$PATH" "$@"' _ "$@"
以下のように使います:
./distrobox.sh ./script.sh
ちなみに Distrobox は nested container としての Docker もサポートしているそうなのですが、今のところ手元では動かせていません。これは今後の課題です。