明示的に GNU 版 coreutils を指定して利用するには
明示的に GNU 版 coreutils を指定して利用する方法です。coreutils-from-gnu と coreutils-from-uutils
Ubuntu 26.04 LTS では、2種類の coreutils を提供しています。- Rust 版 coreutils
- GNU 版 coreutils
Rust 版 coreutils は coreutils-from-uutils パッケージから提供されており、Ubuntu 26.04 LTS では Rust 版 coreutils がデフォルトで採用されているため、coreutils-from-uutils パッケージがプリインストールされています。
その一方で以前 Ubuntu で採用されていた GNU 版 coreutils は、coreutils-from-gnu パッケージから提供されています。
Rust 版 coreutils と GNU 版 coreutils は同じ役割を持つソフトウェアを提供するため、そもそも共存してインストールすることはできません。
実は GNU 版 coreutils もインストールされている
実は GNU 版 coreutils もインストールされています。GNU 版 coreutils の実行ファイルは gnu-coreutils パッケージから提供されており、Ubuntu 26.04 LTS ではこのパッケージがプリインストールされています。
つまり Ubuntu 26.04 LTS では、Rust 版 coreutils と GNU 版 coreutils の両方がプリインストールされていることになります。
コマンドによって使い分けている
さてユーザーが cp や cat など coreutils が提供するコマンドを実行した時に、Rust 版 coreutils もしくは GNU 版 coreutils のいずれかのコマンドが実行されるようになっています。予め Ubuntu 側で coreutils のコマンドごとに、どちらが提供するコマンドを実行するのかを決めています。
cp コマンドの例
ファイルのコピーに使われる cp コマンドの例を見てみましょう。cp コマンドのファイル情報を出力すると、以下のように cp コマンドは /usr/bin/cp へのシンボリックリンクであることが分かります。
実際に cp コマンドのバージョン情報を出力すると、以下のように GNU 版 coreutils の cp コマンドであることが分かります。
cat コマンドの例
次に、ファイルの内容を連結しその結果を標準出力に出力する cat コマンドの例を見てみましょう。cat コマンドのファイル情報を出力すると、以下のように cat コマンドは ../lib/cargo/bin/coreutils/cat へのシンボリックリンクであることが分かります。
もうこの時点で cat コマンドは Rust 版 coreutils が使われていることが分かりますが、せっかくなので cat コマンドのバージョン情報も見てみましょう。
以下のように Rust 版 coreutils の cat コマンドであることが分かりますね。
シンボリックリンクによって使い分けている
つまり Ubuntu 26.04 LTS では、シンボリックリンクによって Rust 版 coreutils 由来のコマンドと GNU 版 coreutils 由来のコマンドを使い分けています。そして coreutils-from-gnu パッケージは、これらのシンボリックリンクを GNU 版 coreutils を指すように変更することで、coreutils 全体を GNU 版 coreutils に変更しています。
なぜ混在しているのか
GNU 版 coreutils と Rust 版 coreutils には完全な互換性がなく、今まで動作していたスクリプトが動作しなくなったり、Rust 版 coreutils に影響の大きい不具合が残っているケースがあるためです。とは言え、将来的に coreutils 全体が Rust 版 coreutils に移行することになるかと思います。
明示的に GNU 版 coreutils を指定して利用するには
上記でも紹介した通り Ubuntu 26.04 LTS には、GNU 版 coreutils もインストールされています。しかし実行ファイル名が従来とは異なっており、実行ファイル名に「gnu」のプレフィックスがつけられています。
/usr/bin/gnu[
/usr/bin/gnuarch
/usr/bin/gnub2sum
/usr/bin/gnubase32
/usr/bin/gnubase64
/usr/bin/gnubasename
/usr/bin/gnubasenc
/usr/bin/gnucat
/usr/bin/gnuchcon
/usr/bin/gnuchgrp
/usr/bin/gnuchmod
/usr/bin/gnuchown
/usr/bin/gnucksum
/usr/bin/gnucomm
/usr/bin/gnucp
/usr/bin/gnucsplit
/usr/bin/gnucut
/usr/bin/gnudate
/usr/bin/gnudd
/usr/bin/gnudf
/usr/bin/gnudir
/usr/bin/gnudircolors
/usr/bin/gnudirname
/usr/bin/gnudu
/usr/bin/gnuecho
/usr/bin/gnuenv
/usr/bin/gnuexpand
/usr/bin/gnuexpr
/usr/bin/gnufactor
/usr/bin/gnufalse
/usr/bin/gnufmt
/usr/bin/gnufold
/usr/bin/gnugroups
/usr/bin/gnuhead
/usr/bin/gnuhostid
/usr/bin/gnuid
/usr/bin/gnuinstall
/usr/bin/gnujoin
/usr/bin/gnulink
/usr/bin/gnuln
/usr/bin/gnulogname
/usr/bin/gnuls
/usr/bin/gnumd5sum
/usr/bin/gnumkdir
/usr/bin/gnumkfifo
/usr/bin/gnumknod
/usr/bin/gnumktemp
/usr/bin/gnumv
/usr/bin/gnunice
/usr/bin/gnunl
/usr/bin/gnunohup
/usr/bin/gnunproc
/usr/bin/gnunumfmt
/usr/bin/gnuod
/usr/bin/gnupaste
/usr/bin/gnupathchk
/usr/bin/gnupinky
/usr/bin/gnupr
/usr/bin/gnuprintenv
/usr/bin/gnuprintf
/usr/bin/gnuptx
/usr/bin/gnupwd
/usr/bin/gnureadlink
/usr/bin/gnurealpath
/usr/bin/gnurm
/usr/bin/gnurmdir
/usr/bin/gnuruncon
/usr/bin/gnuseq
/usr/bin/gnusha1sum
/usr/bin/gnusha224sum
/usr/bin/gnusha256sum
/usr/bin/gnusha384sum
/usr/bin/gnusha512sum
/usr/bin/gnushred
/usr/bin/gnushuf
/usr/bin/gnusleep
/usr/bin/gnusort
/usr/bin/gnusplit
/usr/bin/gnustat
/usr/bin/gnustdbuf
/usr/bin/gnustty
/usr/bin/gnusum
/usr/bin/gnusync
/usr/bin/gnutac
/usr/bin/gnutail
/usr/bin/gnutee
/usr/bin/gnutest
/usr/bin/gnutimeout
/usr/bin/gnutouch
/usr/bin/gnutr
/usr/bin/gnutrue
/usr/bin/gnutruncate
/usr/bin/gnutsort
/usr/bin/gnutty
/usr/bin/gnuuname
/usr/bin/gnuunexpand
/usr/bin/gnuuniq
/usr/bin/gnuunlink
/usr/bin/gnuusers
/usr/bin/gnuvdir
/usr/bin/gnuwc
/usr/bin/gnuwho
/usr/bin/gnuwhoami
/usr/bin/gnuyes
/usr/bin/gnuarch
/usr/bin/gnub2sum
/usr/bin/gnubase32
/usr/bin/gnubase64
/usr/bin/gnubasename
/usr/bin/gnubasenc
/usr/bin/gnucat
/usr/bin/gnuchcon
/usr/bin/gnuchgrp
/usr/bin/gnuchmod
/usr/bin/gnuchown
/usr/bin/gnucksum
/usr/bin/gnucomm
/usr/bin/gnucp
/usr/bin/gnucsplit
/usr/bin/gnucut
/usr/bin/gnudate
/usr/bin/gnudd
/usr/bin/gnudf
/usr/bin/gnudir
/usr/bin/gnudircolors
/usr/bin/gnudirname
/usr/bin/gnudu
/usr/bin/gnuecho
/usr/bin/gnuenv
/usr/bin/gnuexpand
/usr/bin/gnuexpr
/usr/bin/gnufactor
/usr/bin/gnufalse
/usr/bin/gnufmt
/usr/bin/gnufold
/usr/bin/gnugroups
/usr/bin/gnuhead
/usr/bin/gnuhostid
/usr/bin/gnuid
/usr/bin/gnuinstall
/usr/bin/gnujoin
/usr/bin/gnulink
/usr/bin/gnuln
/usr/bin/gnulogname
/usr/bin/gnuls
/usr/bin/gnumd5sum
/usr/bin/gnumkdir
/usr/bin/gnumkfifo
/usr/bin/gnumknod
/usr/bin/gnumktemp
/usr/bin/gnumv
/usr/bin/gnunice
/usr/bin/gnunl
/usr/bin/gnunohup
/usr/bin/gnunproc
/usr/bin/gnunumfmt
/usr/bin/gnuod
/usr/bin/gnupaste
/usr/bin/gnupathchk
/usr/bin/gnupinky
/usr/bin/gnupr
/usr/bin/gnuprintenv
/usr/bin/gnuprintf
/usr/bin/gnuptx
/usr/bin/gnupwd
/usr/bin/gnureadlink
/usr/bin/gnurealpath
/usr/bin/gnurm
/usr/bin/gnurmdir
/usr/bin/gnuruncon
/usr/bin/gnuseq
/usr/bin/gnusha1sum
/usr/bin/gnusha224sum
/usr/bin/gnusha256sum
/usr/bin/gnusha384sum
/usr/bin/gnusha512sum
/usr/bin/gnushred
/usr/bin/gnushuf
/usr/bin/gnusleep
/usr/bin/gnusort
/usr/bin/gnusplit
/usr/bin/gnustat
/usr/bin/gnustdbuf
/usr/bin/gnustty
/usr/bin/gnusum
/usr/bin/gnusync
/usr/bin/gnutac
/usr/bin/gnutail
/usr/bin/gnutee
/usr/bin/gnutest
/usr/bin/gnutimeout
/usr/bin/gnutouch
/usr/bin/gnutr
/usr/bin/gnutrue
/usr/bin/gnutruncate
/usr/bin/gnutsort
/usr/bin/gnutty
/usr/bin/gnuuname
/usr/bin/gnuunexpand
/usr/bin/gnuuniq
/usr/bin/gnuunlink
/usr/bin/gnuusers
/usr/bin/gnuvdir
/usr/bin/gnuwc
/usr/bin/gnuwho
/usr/bin/gnuwhoami
/usr/bin/gnuyes
これらのコマンドを直接指定すれば、明示的に GNU 版 coreutils を利用できます。
というわけで
さて現状はまだ残念ながら coreutils の移行期及び過渡期であり、Rust 版 coreutils の非互換や不具合による問題が相応に報告されています。Ubuntu 26.04 LTS は長期サポート版とは言え、従来の Ubuntu LTS よりも影響の大きい変更が含まれています。
Ubuntu 26.04 LTS を利用する際は、自身が利用しているスクリプトへの影響確認や事前テストを十分に行っておきましょう。




