Windows Subsystem for Linux(WSL)は結構積極的にアップデートされてる感じで、 Windowsの中のファイルの操作みたいなこともだいぶ出来る様になってきています。
その際に面倒なのがショートカットとかシンボリックリンクと言ったものがどうなってるかという点。
以前Cygwinとかからリンクを作る際にどうなるか的なことを調べたりしてましたが、 WSLではどうなってるかという話。
Windowsのショートカット
Windowsでは通常ファイルのショートカットとう形でファイルなどへ別の場所からアクセス出来るようなものを作る事ができます。
ただ、Linuxとかで作るシンボリックリンクとかの様に 単にファイルの別名の様なものではなく、 プロパティから起動引数を指定することが出来たりします。
test.txtみたいなテキストファイルを作って、 右クリックからshortcut.txtという名前のショートカットを作成して Cygwinとかから見ると shortcut.txt.lnkと言ったlnkという拡張子の付いたファイルに見えます。
これはエクスプローラーで拡張子を表示するオプションを付けていても shortcut.txtとしか見えないファイルです。
さらに中身はバイナリファイルになっていて
cat
とかで見ようとしてももとのテキストファイルの内容は見えません。
このファイルをWSL (Ubuntu)の中から見てみると Cygwinの中からと同じ様に.lnkというファイルに見え、バイナリファイルとして見えていました。
Cygwinのシンボリックリンク
上記参照。
何もせずに
$ ln -s test.txt cyg_ln.txt
とシンボリックリンクを作るとWindowsのエクスプローラーでは 種類がもとのtest.txt同様テキストドキュメントとして認識されますが、 中身はtest.txtという文字が中に入っているような文字化けた内容になっています。
なのでWindows側からはまともに使えない状態。
そこで
$ export CYGWIN=winsymlinks:nativestrict
と環境変数を設定して
$ ln -s test.txt cyg_symlink.txt
とすると、とりあえずCygwinの中では同じシンボリックリンクに見えます。
もしくはmklink
というコマンドプロンプトコマンドを呼んで
$ cmd /c mklink cyg_mklink.txt test.txt
symbolic link created for cyg_mklink.txt <<===>> test.txt
とすれば環境変数を設定せずにもシンボリックリンクを作れます。 (引数として元のファイルとターゲットファイルが逆になってるので注意。)
Cygwinの中からはどちらも通常のシンボリックリンクの様に見えます。
$ file cyg_ln.txt cyg_symlink.txt cyg_mklink.txt test txt
cyg_ln.txt: symbolic link to test.txt
cyg_symlink.txt: symbolic link to test.txt
cyg_mklink.txt: symbolic link to test.txt
test.txt: ASCII text
これをエクスプローラーから見てみると.symlinkという種類になっていて、 テキストエディタで開いてみるとちゃんともとのtest.txtの内容が見えます。
Windowsではショートカット以外にもシンボリックリンク(symlink)もサポートしていて、 Windowsの中でも Link Shell Extension とか使うとシンボリックリンクを作ることが出来ます。 (もしくはコマンドプロンプトなどのコマンドで。)
単にファイルの別名を作りたいのであればこちらの方がCygwinでも使えて便利です。
Windows Subsystem for Linuxでのシンボリックリンク
WSLはLinuxなので中でln
を使うことが出来ます。
$ ln -s test.txt wsl_ln.txt
としてみるとWSLの中ではもちろんシンボリックリンクとして扱えます。
これをエクスプローラーとかから見てみると、
CygwinでCYGWIN=winsymlinks:nativestrict
を設定したとき同様symlinkファイルになっています。
WSLでは何もしなくてもシンボリックリンクを作るとWindows側でもシンボリックリンクとして 認識されるファイルが作成される様になっているようです。
CygwinでCYGWIN=winsymlinks:nativestrict
として作られたシンボリックリンクは
WSL側でもシンボリックリンクとして扱えます。
一方、何もせずにWindowsから見えない形のシンボリックリンクだと WSLからもまともに見えず、通常ファイルの様に見え、中身は
$ cat cyg_ln.txt
!<symlink>t e s t . t x t
$ file cyg_ln.txt
cyg_ln.txt: data
の様にバイナリファイルっぽい感じの中身に見えます。
WSLで作ったシンボリックリンクはCygwin側でもシンボリックリンクとして見えます。
まとめ
WSLでシンボリックを作るとWindowsと互換性のあるシンボリックリンクとして作成される、ということでした。
Cygwinなどでは何も設定しないとWindows側との互換性のないものになりますが、 WSLではシステムとしてシンボリックリンクがWinodws互換のものを作るようになっているようです。 (ファイルシステムかなにかが通常のubuntuと違う?)