ls / ll / la コマンドを Windows・Mac・Linux の全てで色付きにしたい

CLI をよく触る方ならご存じであろう ls コマンド。しかし、ls と単に叩いただけでは隠しファイルや詳細のリスト表示まではしてくれません。
もちろんその方が都合のいいこともあるのですが、よくありがちな「ファイルを隠しファイル込みでリスト表示してほしい」ときに毎回 ls -la しないといけないのはそれなりに面倒です。

そこでエイリアスを設定し、ll でリスト表示、さらに la で隠しファイル込みの一覧表示ができるようにしたいと思います……と、ここまでは数多ある技術ブログにありがちな内容。

この記事ではさらに、ls の表示結果を Windows・Mac・Linux の全ての環境で色付きで表示させる方法も紹介します。

やっぱり色がついていた方がなんとなく見やすくないですか?私はそうです。
ところが、一言で ls コマンドと言っても環境によってかなり差異があるようで、OS や環境によって色がついたりつかなかったりします。
私は Windows・Mac (macOS)・Linux の3つの OS を常用しているので、常にできるだけ三者の CLI 環境を同じような状態に整えておきたいという思惑がありました。
そこで、色々調べてたどり着いた結果をメモしておく次第です。Windows に関してはいろいろ目から鱗な情報が多いと思います。

この記事では最低限のオプションしか付与していませんが、応用で他のオプションと組み合わせてみても良いと思います。

ちなみに、一番手順が楽なのは Linux です(一番面倒なのは案の定 Windows です)。
普通の Ubuntu なら標準ですでに色付きで ll とか la も使えるようになっている気がする…🤔

Sponsored Link

Windows

最初は一番の難関だった Windows から。

DJTANISUKEの日記

というか、まずコマンドプロンプトには ls なんぞいうコマンドはありません。
あるのは dir とかいう色付き機能のないレガシーな組み込みコマンドだけです。なので、窓から投げ捨てます。窓 (Windows) だけに
そもそもコマンドプロンプトはレガシー過ぎて圧倒的に使いにくいので、dir コマンドで満足という方も今すぐ窓から投げ捨てる事を強くおすすめします。せめて Clink を入れましょう。

PowerShell を使う

代わりに使うのは PowerShell 。色々不評でクセも強いですが(とっつきにくいけど言語仕様としてモダンではある)、コマンド履歴や色付き表示や UTF-8 など現代的で文化的な機能は整っているし、とりあえず他のコマンドを叩くためのシェルとしては悪くありません。あと地味にコマンドをハイライトしてくれる。

PowerShell には Windows PowerShell と PowerShell の2つがあります。…ちょっとよく分からない?
詳細は割愛しますが、歴史的な事情でバージョン 5.1 までの PowerShell は Windows PowerShell 、バージョン 6 までの PowerShell は PowerShell Core 、バージョン 7 以降の PowerShell は PowerShell(無印)と呼ばれています。

PowerShell Core (PowerShell Core 6) 以降からはクロスプラットフォームで OSS になっているため[1]Core というのはクロスプラットフォームで OSS 化された .NET 系の資産共通の名称、実は PowerShell は Mac や Linux でも使えたりします。クセ強いしまず使う人いないだろうけど…。
ずっと Core つけるのも邪魔だよねって事で、今まで Windows PowerShell と正式には呼ばれていたことを逆手に取り、Windows を取った無印「PowerShell」として 7 系以降がリリースされています。

Windows で開発してる人の中には毎回コンソール立ち上げる度に「新しいクロスプラットフォームの PowerShell をお試しください https://aka.ms/pscore6」とか言われてるけどとりあえずガン無視してきた方もいると思うんですが、そのクロスプラットフォームの PowerShell というのがさっき説明してきたそれに当たるわけです。

長々と説明してきましたが、個人的には現在も開発が続いている PowerShell 7 を新たにインストールすることをおすすめしています。
PowerShell Core 6 は、PowerShell 7 がリリースされている以上、わざわざインストールする動機はありません。OS にプリインストールされている Windows PowerShell 5.1 は、コマンドプロンプト (cmd.exe) ほどではないもののメンテナンスモードにあり、将来性はありません。

後で触れる Git Bash でもいいんですが、MinGW で擬似的に Linux を表現している関係上、個人的にはそれはそれで面倒くささがあるように感じたため PowerShell の方を使っています。ここは好みで。
Git Bash も完全に Unix の Bash を再現できているわけではないので、本当の Bash がほしければ WSL (WSL2) の方を使うのがよいと思います。私も Web 開発では WSL の Bash を使っています。
とりあえず、コマンドプロンプトを使い続けるのだけは人権を破り捨てているようなものなので今すぐやめましょう…

PowerShell は知名度もさほど情報もなく、未だにコマンドプロンプトを使っている悲しい人を割と見かけたので前段として書きました。あとここでは触れませんでしたが、Windows Terminal はもはや現代的で文化的な開発体験を送るためにマストです。
Windows だと人によって DX (Developer eXperience) の差がひどい…

Git Bash についてくる Unix コマンドをシステム環境変数にぶち込む

…ここまで語ってきてあれなんですが、PowerShell の ls コマンドの表示内容は正直 dir コマンドと大差ありません。色も付きません。Unix 系の ls のオプションは使えません。
というより、名前が同じだけで Unix 系の ls とは完全に別物の、Get-ChildItem というコマンドレットのエイリアスです。

Get-ChildItem はこれはこれで色々機能がついてたりするみたいですが、Unix 系の ls を求めている方にとっては違和感が拭えないでしょう。とはいえ、前述の通り Git Bash をそのまま使うのも Windows との親和性的に微妙…

…ということで、Git Bash (Git for Windows) をインストールし、その上で Git Bash (MinGW) にもれなくついてくる Unix コマンドをシステム環境変数にぶち込みます。
本来 Git Bash 同梱の Unix コマンドは Git Bash 内でしか使えないようになっていますが、実態はただの exe ファイルなので、パスを通してしまえば他のシェルでも使えるというわけです。
インストール先を変更していなければ、C:Program FilesGitusrbin をシステム環境変数に追加するだけです。

こうすることで、PowerShell 、そしてコマンドプロンプトからも、ls を筆頭に grep とか使い慣れた Unix コマンドが使えるようになります!
Git for Windows 自体はすでにインストールしている方の方が多いでしょうし、インストール時のオプションで指定していれば最初からそうなっている方もいるはず。
WSL 上のコマンドを使うこともできなくはないですが、良くも悪くも Windows 向けにローカライズされた Unix コマンドの方が Windows との親和性が高いと思っています。

プロファイル設定

ようやっと Unix ライクな ls が使えるようになったので、プロファイルに llla のエイリアスと、それらが全て色付きで表示されるようにプロファイルを設定します。

Bash ではホームディレクトリ (~/) の .bash_profile がプロファイルでしたが、Windows 上の PowerShell の場合はドキュメントフォルダの中にある PowerShell (6以降) or WindowsPowerShell (5.1以前) の Profile.ps1 がプロファイルです。なければ作成しましょう。

よくプロファイルを Microsoft.PowerShell_profile.ps1 にしている人がいますが、それも誤りではありません。ただ、ドキュメントいわく 本来は Profile.ps1 がベースで、PowerShell がホストになる場合に限定したプロファイルとしてこういう長ったらしい名前があるらしい?です。
どちらにしても問題なく動くので、長いのが嫌であれば Profile.ps1 にリネ―ムしておきましょう。

# Alias
del alias:ls  # PowerShell 側の ls を削除
function ls() {
    ls.exe --color=auto $args
}
function ll() {
    ls.exe --color=auto -l $args
}
function la() {
    ls.exe --color=auto -la $args
}

あとは Profile.ps1 に以上の内容をコピペして保存してください。すでにプロファイルがある人はそれに追記する感じで。

PowerShell では関数がコマンドとして動きます。
地味に便利なこの機能を利用して、llla が実行されたら、ls.exe に色を付ける --color=auto-l または -la$args に格納されている引数リスト を渡して実行されるようにします。
実は Set-Alias というエイリアスを登録するコマンドレットもあるのですが、Set-Alias はなぜか引数を設定することができないため、このような手法を取っています。

また、ls にはデフォルトで前述の Get-ChildItem のエイリアスが貼られているため、del alias:ls で事前に解除しています。
ls 以外にも mv とか rm にも PowerShell 側のコマンドレットのエイリアスが貼られているので、それらでも Unix コマンドの方を使いたいのであれば、同様の手順でエイリアスを解除しておくとよいでしょう。

あとはコンソールを再起動すれば、Windows でも ls / ll / la と打つと色付きで表示されるはずです!

ひとつだけ注意点:ls ll では、Mac や Linux と同様に .gitconfig などのファイル名の先頭に .(ドット)がついている隠しファイルや隠しフォルダは表示されません。
ただし、dirGet-ChildItem とは異なり、Windows (NTFS) の隠しファイル属性が掛かっているファイルやフォルダは Git Bash 付属の ls.exe だと表示されてしまいます。
これはおそらく MinGW 側の仕様です。そのためエクスプローラーにはまず表示されない NTUSER.DAT[2]ユーザーごとのレジストリデータが保存されている特殊なファイル とかも見えてしまいますが、とはいえホームディレクトリ以外でそうした隠しファイル属性をつける事はまずないでしょうし、そこまで問題ではないように思います。

Mac (macOS)

お次は Mac (macOS) です。
Windows と違って普通の ls が入っているし、普通に Bash も動くし大丈夫かな~と思いきや、実は Mac の ls では --color=auto が効きません。

これは他のブログなどでも解説されていますが、そもそも Mac はあくまで Unix 系 OS であり、Linux ではありません。Unix コマンド、と今まで書いてきたのもそういう所以です。

macOS (OSX) の祖先は FreeBSD などで知られる BSD で、いわゆる BSD 系 OS です。
Ubuntu などの Linux 系 OS とは 同じ Unix を祖先に持つためコマンドやディレクトリ構造は共通しているものの、かなり前に分岐しているため、いわば遠い親戚のような状態です。
そのため、名前は同じでも Linux と比較すると仕様に差異のあるコマンドが、ls を筆頭にいくつか存在します。

BSD 系の ls と Linux 系の ls は表示自体は似ているものの、詳細なオプションの互換性はないようです。
ここでは触れませんが、ls のハイライトの色を変更する環境変数の名前[3]LSCOLORS と LS_COLORSや書式も BSD 系と Linux 系では異なります。

プロファイル設定

Bash なら .bash_profile を、zsh なら .zprofile をお好きなエディタで編集します。

# Alias
alias ls="ls -G"
alias ll="ls -lG"
alias la="ls -laG"

あとは以上の内容をコピペして保存してください。すでにプロファイルがある人はそれに追記する感じで。

Homebrew で Coreutils に入っている Linux 系の ls を入れることもできるにはできるのですが、無難にデフォルトで入っている BSD 系の ls で色付き表示ができるようにしてみました。
-G オプションで色を表示できます。

あとはコンソールを再起動すれば、Mac でも ls / ll / la と打つと色付きで表示されるはずです!

Linux

Linux はここまでやってきた中で一番簡単です。
ディストリビューションや環境にもよると思いますが、すでに標準で .bashrc に lsllla のエイリアスが使えるように設定されている場合もあります。

プロファイル設定

Mac と同じく .bash_profile に追記します。別のシェルを使っている場合は適宜読み替えてください。

# Alias
alias ls="ls --color=auto"
alias ll="ls --color=auto -l"
alias la="ls --color=auto -la"

以上の内容をコピペして保存してください。すでに .bash_profile がある人はそれに追記する感じで。

Linux の ls は皆さんがおそらく一番慣れ親しんでいるであろう ls です。
--color=auto をつけることで、可能であれば色をつけてハイライトして出力するようになります。

あとは Mac や Windows 同様にコンソールを再起動すれば、Linux でも ls / ll / la と打つと色付きで表示されるはずです!

感想

コード自体の量は大したことありませんが、この答えにたどり着くまでにかなり試行錯誤が必要で苦労しました。クロスプラットフォームつらい。

References

References
1 Core というのはクロスプラットフォームで OSS 化された .NET 系の資産共通の名称
2 ユーザーごとのレジストリデータが保存されている特殊なファイル
3 LSCOLORS と LS_COLORS

コメント