rcmdnk's blog

Amazon.co.jp: Windows Subsystem for Linux(WSL)によるLAMP環境簡単構築 eBook: 小松 祐一: Kindleストア

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と違う?)

Sponsored Links
Sponsored Links

« 超音波洗浄器を買ってみた macOS 10.14.6の追加アップデートを適用したところKarabiner-Elementが動かなくなった »

}