以前 cygwin 上で、Windows Vista 以降の NTFS ネイティブなシンボリックリンクを作るために逡巡したことがあって、一応できたのだが、それは諸々の環境を整えた上で最終的には [cci]cmd /c mklink[/cci] を呼ぶというものであった。
これだとメッセージが mklink のそれになってしまうし、コードページの不整合が起きる(つまり UTF-8 な端末で呼ぶとメッセージが文字化けする)というどうでもいいけどどうでもよくない不都合もある。それを置いても、やはり cygwin の中からコマンドプロンプトベースの実行ファイルを呼び出すのはなんともイケてない。なんとかならないか。
さて Windows 側のシステム環境変数 [cci]CYGWIN[/cci] に設定する値によって、cygwin の動作を制御することができるのだが(ドキュメント)、その中に winsymlinks という項目がある。これを [cci]nativestrict[/cci] という値にすることによって解決できた。ちなみにこの項目は [cci]lnk[/cci]、[cci]native[/cci]、[cci]nativestrict[/cci] の 3 つの値を割り当てることができるのだが、
- lnk: シンボリックリンクとして Explorer が認識する .lnk ファイルを作成する
- native: シンボリックリンクとして NTFS ネイティブなそれを作成する。作成が不可能な場合(NTFS じゃないとか、権限がないとか)は、lnk として振る舞う
- nativestrict: native と同様に ネイティブなシンボリックリンクを作成するが、作成が不可能な場合はエラーを返す
というわけで、ナウい cygwin で NTFS ネイティブなシンボリックを作成するには
- Administrators グループに属する別のアカウントを作成する
- 普段使用するアカウントを Administrators グループから外し、Users に含めるようにする(これにより、UAC ダイアログでは単なる権限のエスカレーションの確認だけでなく、管理者アカウントのパスワードを入力を求められるようになるが、慣れるしかない)
- ローカルセキュリティポリシーを起動し、[cci]セキュリティの設定 -> ローカルポリシー -> ユーザー権利の割り当て[/cci] の中にある [cci]シンボリック リンクの作成[/cci] に普段使用するアカウント名を追加する
- システム環境変数 [cci]CYGWIN[/cci] に [cci]winsymlinks:nativestrict[/cci] を追加する
という手順になる。