対処法
環境変数を追加する。
set -Ux COLORTERM 1
もしこれで直らなければシェルを再起動するか、以下 2 つのグローバル変数を消去する。
set -e __fish_ls_command
set -e __fish_ls_color_opt
あるいは athityakumar/colorls をインストールするとそちらが使われるようになる。
また、試していないが coreutils をインストールすることでも解消すると思われる。
補足
type ls
で確認するとわかるが、 fish では ls
コマンドは標準の関数でラップされており、
カラー化するオプションを追加してくれている。
分岐を見ると、特定の条件を満たした場合1はカラー化オプションを決定するために
ls --color=auto
(GNU 系で有効)ls -G
(macOS, BSD 系で有効)ls --color
ls -F
の順で試行し、エラーにならなければそのオプションを採用するようだ。
しかし macOS Monterey でコマンドを実行してみると、 ls --color=auto
はエラーにならないしカラーにもならない。
macOS Monterey の ls --color=auto
は、 stdout が tty でありかつ COLORTERM
環境変数が設定されている場合のみカラー表示を行うためだ2。
つまり環境変数 COLORTERM
を定義しておけばカラー表示されるようになる。値はなんでも良いようだ。
さらに補足
ls --color=auto
は以前の macOS ではエラーになっていた。 (おそらく Big Sur まで?)
❯ ls --color=auto
ls: illegal option -- -
usage: ls [-@ABCFGHLOPRSTUWabcdefghiklmnopqrstuwx1%] [file ...]
このため以前までは、前述のラッパー関数の判定で ls -G
が実際に実行されるコマンドになっていた。
man を見るとこのような違いがある。 BSD の実装から独自実装に変わったのだろうか。これについては検索しても情報が見つけられなかった。
Big Sur:
LS(1) BSD General Commands Manual LS(1)
NAME
ls -- list directory contents
SYNOPSIS
ls [-ABCFGHLOPRSTUW@abcdefghiklmnopqrstuwx1%] [file ...]
... (略)
BSD May 19, 2002 BSD
Monterey:
LS(1) General Commands Manual LS(1)
NAME
ls – list directory contents
SYNOPSIS
ls [-@ABCFGHILOPRSTUWabcdefghiklmnopqrstuvwxy1%,] [--color=when] [-D format]
[file ...]
... (略)
macOS 12.0 August 31, 2020 macOS 12.0
追記: Big Sur は Intel Mac で、 Monterey は M1 Mac で使用していた。