【WSL】意外と知らない?大文字・小文字の同名ファイルの区別についての大事なこと

bashカテゴリに厳密には当てはまらないかもしれませんが、Windows10のWSLで予想外なことが起きたのでメモします。


まずは動作環境について

結論

以下のページにその答えを発見。

news.mynavi.jp

こんなこと全然知りませんでした。
もしかして私だけ?

何があったのか、そもそも何の話なんだ

前回、前々回とbashカテゴリでパス名展開の記事を書いているとき、あることに気付きました。


リダイレクトを使って、パス名展開に利用するファイルをコツコツと作っていました。

$ >aaa.dat
$ ls
000.dat  002.dat  004.dat  112.dat  114.dat  dir1
001.dat  003.dat  111.dat  113.dat  aaa.dat  dir2

まあここまでは当たり前のように空ファイル"aaa.dat"が作られています。


で、偶々なんとなく次を実行してみたときに、あることに気づきます。

$ >aaA.dat
$ ls
000.dat  002.dat  004.dat  112.dat  114.dat  dir1
001.dat  003.dat  111.dat  113.dat  aaa.dat  dir2

$ >aAA.dat
$ ls
000.dat  002.dat  004.dat  112.dat  114.dat  dir1
001.dat  003.dat  111.dat  113.dat  aaa.dat  dir2

あれ?
大文字小文字の区別がされてないの?
リダイレクトだとこうなるの?


どういうことなの...。



で、今度はファイルの中身も含めて調査

$ cat aaa.dat

$ echo a>aaa.dat
$ cat aaa.dat
a

$ echo A>AAA.dat
$ ls
000.dat  002.dat  004.dat  112.dat  114.dat  dir1
001.dat  003.dat  111.dat  113.dat  aaa.dat  dir2

$ cat aaa.dat 
A
$ cat AAA.dat 
A

ここで気付く。

これはどうもこのbash全体で起こっていることだと...。

改めて、結論について

Windows 10ミニTips(285) 大文字・小文字を区別したファイル名をWindows 10でも使いたい | マイナビニュース

「こんなことあるのかよ...」とgoogleさんに相談。数分後、答えに辿り着く。


MS-DOS時代の慣例だそうです。
(こんなもん呪いって言ってやってもいいと思いますけどね。)


リンク先の手順に従い、コマンドプロンプトで確認

>fsutil.exe file queryCaseSensitiveInfo C:¥Users¥UserName¥Desktop
ディレクトリ C:\Users\UserName\Desktop の大文字と小文字を区別する属性が無効になっています。

fsutil.exe file SetCaseSensitiveInfo C:¥Users¥UserName¥Desktop enable
ディレクトリ C:\Users\UserName\Desktop の大文字と小文字を区別する属性が有効になっています。

なるほど...。


もし、ここでファイルパスに空白文字がある場合。

たとえば、
UserName => User Name
のようになっているなど。


こういったときにはスペースをエスケープ文字を利用して、エスケープすることでおそらく解決します。


ちなみに私はうまくエスケープできなかったのでMS-DOS短縮を利用して対応しました。(以下ページ参照)
tipstour.net



終わりに

こんなことがあるとは思ってもみませんでした。

「全体で大文字小文字の区別を有効にすりゃええやん」とも思いましたが、試しにターミナル上でcodeとCODEのどちらを実行してもVS codeが立ち上がります。


もしもシステムで大文字小文字の区別をせずにソフト同士を紐づけしているのなら、区別を有効にすることで正常に機能しないソフトウェアに早変わりしそうです。


開発は純粋なOSやディストリビューション上で行うことがベストなのかもしれませんね。


組み込むハード側のOSに制限がある場合には知っておかないと苦労しそうです。