Ubuntu のwhich コマンド

Windows 10にWSL 2 Ubuntu をインストールしている。Debian 系のディストリビューションを使うのは初めてで、まだ慣れない。

ところで、Ubuntu のwhich コマンドが私の常識と異なり、コマンドが見つからなかったときに何もメッセージを表示しない。

# Ubuntu on WSL 2
$ which non_existent_command
$

# Cygwin
$ which non_existent_command
which: no non_existent_command in (/usr/local/bin:/usr/bin:(※以下略)

Cygwin のwhich はGNU 製で、which --version でそれがわかるが、Ubuntu のwhich はバイナリではなくシェルスクリプトで、--version オプションなどはない。あるのは-a オプション(すべて表示)のみ。

まずUbuntu のwhich コマンドがどのパッケージに含まれているか確認してみる。

$ which which
/usr/bin/which

$ dpkg -S /usr/bin/which
dpkg-query: no path found matching pattern /usr/bin/which

/bin -> usr/bin のシンボリックリンクが張られていて、本体は/bin/which のほうだった。

$ dpkg -S /bin/which
debianutils: /bin/which

debianutils パッケージに含まれていることがわかった。そこから少しウェブで検索したが、Ubuntu(Debian)がGNU which を使わない理由はわからなかった。

[2021-11-12追記]
Debian's which hunt [LWN.net] によると、which コマンドはPOSIX に含まれておらず、GNU which 以外にもいろいろな実装がある。GNU which の動作が当たり前だと思っていたことがそもそも間違いだったようだ。