【WSL】意外と知らない?大文字・小文字の同名ファイルの区別についての大事なこと
bashカテゴリに厳密には当てはまらないかもしれませんが、Windows10のWSLで予想外なことが起きたのでメモします。
まずは動作環境について
何があったのか、そもそも何の話なんだ
前回、前々回と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に制限がある場合には知っておかないと苦労しそうです。