Включить собственные символьные ссылки NTFS для Cygwin
Последние NTFS и Windows реализуют символьные ссылки:
-
точка соединения NTFS может использоваться в качестве символьной ссылки на каталог начиная с NTFS 3.0 (Windows 2000) с помощью инструментов
linkd
илиjunction
. -
символическая ссылка NTFS также может использоваться в качестве символьной ссылки (как для файла, так и для каталога), так как Windows Vista использует инструмент
mklink
.
ln -s
создает текстовый файл.
На Cygwin:
$ ln -s -v target mylink
`mylink' -> `target'
На MinGW (или ваш любимый редактор):
$ cat mylink
!<symlink>ÿþt a r g e t
Можно ли сказать Cygwing использовать NTFS junction point или NTFS symbolic link ?
Другой вопрос: доступно ли это на MinGW?
4 ответа:
Краткий ответ
Определить переменную окружения:
CYGWIN=winsymlinks:nativestrict
Как указывает mwm, вам также может потребоваться запустить bash в качестве администратора.
Ответ
По умолчанию символические ссылки Cygwin - это обычные файлы
По умолчанию Cygwin создает текстовые файлы в качестве обходного пути для ошибки символьной ссылки Windows. Эти файлы на самом деле не являютсясимвольными ссылками . Почти все программы Windows не рассматривают эти файлы как символьная ссылка.
Собственные символьные ссылки доступны в последних версиях Windows
Последние NTFS и Windows реализуют символьные ссылки:
- точка соединения NTFS может использоваться в качестве символьной ссылки каталога начиная с NTFS 3.0 (Windows 2000) с помощью инструментов
linkd
илиjunction
.- символическая ссылка NTFS также может использоваться в качестве символьной ссылки (как для файла, так и для каталога) начиная с Windows Vista с помощью инструмента
mklink
.Cygwin может создавать собственные NTFS символические ссылки
Упрощенная выписка из документации Cygwin :
Символические ссылки
[...]
Cygwin создает символические ссылки потенциально несколькими различными способами:
Символические ссылки по умолчанию-это простые файлы, содержащие волшебный файл cookie далее следует путь, на который указывает ссылка. [...]
Символьные ссылки в стиле ярлыков-это Windows
.lnk
[...] создан если окружающая среда переменная CYGWIN [...] устанавливается, чтобы содержать строкаwinsymlinks
илиwinsymlinks:lnk
. [...]Собственные символьные ссылки Windows создаются только в Windows Vista / 2008 и более поздних версиях, и только на файловых системах, поддерживающих точки повторного анализа. Из-за их странных ограничений и поведения, они только созданы если пользователь явно запрашивает их создание. Это делается путем установки переменной среды CYGWIN содержать строку
winsymlinks:native
илиwinsymlinks:nativestrict
. [...]О том, что Файловая система NFS, Cygwin всегда создает реальные символьные ссылки NFS.
Настройка Cygwin
Руководство пользователя Cygwin представляет переменную
CYGWIN
и опциюwinsymlinks
:Переменная окружения
CYGWIN
используется для настройки многих глобальных параметров [...]. Он содержит параметры, перечисленные ниже, разделенные пустыми символами. [...]
- [...]
- [...]
- [...]
- [...]
winsymlinks:{lnk,native,nativestrict}
- если задано значение простоwinsymlinks
илиwinsymlinks:lnk
, Cygwin создает символьные ссылки как ярлыки Windows со специальным заголовком и набором атрибутов R/O.Если задано значение
winsymlinks:native
илиwinsymlinks:nativestrict
, Программа создает симлинки как родной Windows ссылки на файловые системы и версии ОС, поддерживающие их. Если известно, что ОС не поддерживает собственные символьные ссылки (Windows XP, Windows Server 2003), предупреждающее сообщение производится один раз за сеанс.Разница между
winsymlinks:native
иwinsymlinks:nativestrict
заключается в следующем: если файловая система поддерживает native symlinks и Cygwin не удается создать собственную символическую ссылку по какой-то причине, он вернется к созданию символьных ссылок Cygwin по умолчанию с помощьюwinsymlinks:native
, в то время как сwinsymlinks:nativestrict
системный вызовsymlink(2)
немедленно завершится ошибкой.
CYGWIN=winsymlinks:native
всегда создает ссылку, но использует резервную копию Cygwin, когда target не существуетНа Cygwin:
$ export CYGWIN="winsymlinks:native" $ ln -s -v target mylink `mylink' -> `target' $ echo content > target
На MinGW:
$ cat mylink content
Люди, использующие программы Windows и Cygwin, могут иметь проблемы, когда символьная ссылка создается как фиктивный файл (резервная копия Cygwin, когда цель отсутствует)...
CYGWIN=winsymlinks:nativestrict
всегда использует символьную ссылку native-Windows, но терпит неудачу, когда target не существуетНа Cygwin:
$ export CYGWIN="winsymlinks:nativestrict" $ rm -f a b $ ln -sv a b ln: failed to create symbolic link `b': No such file or directory $ touch b $ ln -sv a b ln: failed to create symbolic link `b': File exists $ rm b $ touch a $ ln -sv a b `b' -> `a'
Потому что
nativestrict
Если цель существует до создания символьной ссылки, некоторые команды / сценарии могут завершиться ошибкой при создании ссылки.Примечание: только администраторы имеют возможность создавать собственные символические ссылки NT так под Windows UAC, эмулятор терминала Cygwin (mintty) должен выполняться с повышенными привилегиями (щелкните правой кнопкой мыши ярлык и выберите Запуск от имени администратора или установите свойство mintty shortcut, Advanced → Run as Administrator ).
Общепринятый ответ-правильный, две маленькие побочные заметки.
Если вы заботитесь только о символических ссылках, которые вы создаете сами в командной строке, установите пакетcygutils-extra
, он включает командуwinln
, которая имеет тот же синтаксис, что иln
, но создает собственные ссылки Windows. Создайте псевдоним:alias ln=winln
(работает только в интерактивной оболочке) или даже замените файлln
наwinln
(работает также в скриптах оболочки) - но он может быть перезаписан при следующем обновлении пакетаcoreutils
.У меня есть я только узнал, что можно использовать нативные символьные ссылки, когда у меня уже был установлен Cygwin, и добавил некоторые символьные ссылки сам. Поэтому после того, как я установил
CYGWIN=winsymlinks:native
в качестве переменной окружения моей системы, я хотел преобразовать все существующие неродные ссылки в родные. Вот что я сделал.На всякий случай сначала создайте резервную копию всего каталога Cygwin.
Найдите все символьные ссылки и сохраните список в файл
/links
:cd /; find . -regextype egrep -regex './(dev|proc|mnt|cygdrive)' -prune -o -type l -print >links
Обзор
links
. Создайте архивtar
со всеми ссылками:tar c --files-from=links >links.tar
Извлечение архива
tar
:tar x --files-from=links <links.tar
Поскольку теперь включены собственные символьные ссылки, tar заменит старые символьные ссылки Cygwin на собственные символьные ссылки.Очистка:
P.S. сначала я использовалrm -f links links.tar
CYGWIN=winsymlinks:nativestrict
, но потом обнаружил, что в этом режимеln -s target link
терпит неудачу, еслиtarget
не существует. Напротив,native
создаст символическую ссылку Cygwin (неродную)link
, указывающую на несуществующуюtarget
-Это соответствует поведениюln
в системах UNIX. В редких случаяхnativestrict
может разбейте некоторые программы или скрипты, например Gentoorun-crons
script использует файл блокировки, который является символьной ссылкой, указывающей на PID запущенного процесса. В режимеnativestrict
скрипт перестал работать, так как больше не мог создать файл блокировки. Примечание:run-crons
- это вспомогательный скрипт crontab на Gentoo Linux, добавляющий поддержкуcron.{hourly,daily,weekly,monthly}/
dirs, он очень хорошо работает с Cygwin.
Поскольку ответ @olibre не сработал для меня. Я только что создал функцию оболочки.
: ' mklink - Create NTFS (Windows) links that is usable by Windows and Cygwin Usage: mklink [/D | /H | /J] <link-path> <target-path> Options: /D Directory Symbolic Link /H Hardlink /J Directory Junction (you should prefer /D) With no options, it creates a NTFS file symlink. ' mklink () { if [ "$#" -ge "3" ]; then cmd /c mklink "$1" "$(cygpath --windows --absolute "$2")" "$(cygpath --windows --absolute "$3")" else cmd /c mklink "$(cygpath --windows --absolute "$1")" "$(cygpath --windows --absolute "$2")" fi }
Обратите внимание, что вам нужны права администратора (для Cygwin), чтобы выполнить вышеописанное без проблем.
Обратите внимание, что я не знаю, есть ли какая-либо разница между символической ссылкой на абсолютный путь и символической ссылкой на относительный путь с помощью командлета
mklink
. В Linux эти 2 имеют разное поведение, если вы когда-либо решите переместить символическую ссылку или переместить целевой файл, или переместить оба.