Включить собственные символические ссылки NTFS для Cygwin

последние NTFS и Windows реализуют символические ссылки:

  • точка соединения NTFS может использоваться в качестве символической ссылки каталога с NTFS 3.0 (Windows 2000) с помощью linkd или junction инструменты.
  • символическая ссылка NTFS также может использоваться в качестве символической ссылки (как для файла, так и для каталога) с Windows Vista с помощью .

но на Cygwin 1.7 (установлен на Windows 7),ln -s создает текстовый файл.

on В Cygwin:

$ ln -s -v target mylink
`mylink' -> `target'

на MinGW (или ваш любимый редактор):

$ cat mylink
!<symlink>ÿþt a r g e t 

можно ли сказать Cygwing использовать точка соединения NTFS или символическая ссылка NTFS?

другой вопрос: это доступно на MinGW?

4 ответов


короткий ответ:

определить переменную окружения:

CYGWIN=winsymlinks:nativestrict

как указал mwm возможно, вам придется работать Баш от имени администратора.

ответ

символические ссылки Cygwin по умолчанию - это обычные файлы

по умолчанию Cygwin создает текстовые файлы в качестве обходного пути для ошибки символической ссылки Windows. Эти файлы на самом деле не ссылки. Почти все Программы Windows не рассматривают эти файлы как символические ссылки.

собственные символические ссылки доступны в последних версиях Windows

последние NTFS и Windows реализуют символические ссылки:

  • точка соединения NTFS можно использовать как симлинк каталога начиная с NTFS 3.0 (Windows 2000) с помощью linkd или junction инструменты.
  • символическая ссылка NTFS также может использоваться в качестве символической ссылки (как для файла, так и для каталога) с Windows Vista используя .

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 с помощью специального headerand Р/О набор атрибутов.

    , если значение winsymlinks:native или winsymlinks:nativestrict, Cygwin создает символические ссылки как родной Windows ссылки на файловые системы и версии ОС, поддерживающие их. Если ОС не поддерживает собственные символические ссылки (Windows XP, Windows Server 2003), предупреждающее сообщение производится один раз за сеанс.

    разницу между winsymlinks:native и winsymlinks:nativestrict это: если файловая система поддерживает native симлинки и 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 fallback, когда цель отсутствует)...

CYGWIN=winsymlinks:nativestrict
всегда использует native-Windows symlink, но терпит неудачу, когда 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,дополнительно → Запуск от имени администратора).

отдельное спасибо Гурии и жуткий за их вклад.


принятый ответ правильный, две маленькие Примечания.

если вы заботитесь только о символических ссылках, которые вы создаете сами в командной строке, установите , Он включает в себя winln команда, которая имеет тот же синтаксис, что и ln, но создает собственные ссылки Windows. Создайте псевдоним:alias ln=winln (работает только в интерактивной оболочке), или даже заменить С winln (работает и в скриптах оболочки) - но он может быть перезаписан в следующий раз coreutils пакет усовершенствованный.

я только узнал, что можно использовать родные символические ссылки, когда я уже установил Cygwin, и добавил некоторые символические ссылки сам. После того, как я поставил CYGWIN=winsymlinks:native как моя системная переменная среды, я хотел преобразовать все существующие неродные ссылки в 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 С родной симлинки сейчас включен, ТАР будет перезаписывать старые симлинки по Cygwin с родной симлинки.

очистить: rm -f links links.tar

С. П. Сначала я использовал CYGWIN=winsymlinks:nativestrict, но потом я узнал, что в этом режиме ln -s target link, если не target не существует. Напротив,native создаст Cygwin (неродным) симлинк link указывая на несуществующий target - это соответствует поведению ln в системах UNIX. В редких случаях, nativestrict может сломать некоторые программы или скрипты, например Gentoo run-crons скрипт использует файл блокировки, который является символической ссылкой, указывающей на PID запущенного процесса. В nativestrict mode скрипт перестал работать, потому что он больше не мог создавать файл блокировки. Примечание:run-crons является crontab вспомогательный скрипт на Gentoo Linux, добавив поддержку cron.{hourly,daily,weekly,monthly}/ Дирс это очень хорошо работает с 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 "" "$(cygpath --windows --absolute "")" "$(cygpath --windows --absolute "")"
    else
        cmd /c mklink "$(cygpath --windows --absolute "")" "$(cygpath --windows --absolute "")"
    fi

}

обратите внимание, что вам нужны разрешения администратора (для Cygwin) для запуска выше без проблем.

обратите внимание, что я не знаю, есть ли разница между символической ссылкой на абсолютный путь и символической ссылкой на относительный путь с помощью CMD mklink. На Linux, эти 2 разные модели поведения, если вы вдруг решили переместить ссылку или переместить файл, или переместить оба.


вы, вероятно, искали способ добраться до другого места назначения в дереве каталога с помощью MSYS. Есть способ. Вы должны создать сценарий оболочки ("*.SH " файл), который содержит строку:

cd "/drive_letter/SubCatalogue/SubFolder/..."