检查Cygwin中符号链接类型的差异。

5

我根据需要和可行性使用winsymlinks:native和cygwin符号链接。我希望有一种cygwin的方法可以查看它是哪种符号链接,因为它只看到一个符号链接,但DOS看到了不同之处。我需要知道差异,以便处理rsync等,并保留(或重新创建)符号链接的类型。

我有权限创建dos本地符号链接并有设置任一的功能:

    $ touch test

    # cygwin style symlink
    $ CYGWIN=  ln -s test t1

    # WINDOWS style
    $ CYGWIN=winsymlinks:native  ln -s test t2

    # for good measure make one the DOS way
    $ cmd /c mklink t3 test
    symbolic link created for t3 <<===>> test

cygwin 将它们全部视为符号链接:

    $ ls -l
    total 1
    lrwxrwxrwx  1 user Users 4 Jun 14 11:06 t1 -> test
    lrwxrwxrwx  1 user Users 4 Jun 14 11:06 t2 -> test
    lrwxrwxrwx  1 user Users 4 Jun 14 11:06 t3 -> test
    -rw-rw-rw-+ 1 user Users 0 Jun 14 11:05 test

Windows知道本地符号链接: 资源管理器截图 或者从DOS中看到:

    $ cmd /c dir /a
     Volume in drive C is Windows
     Directory of C:\Cygwin-32\tmp
    06/14/2014  11:06 AM                22 t1
    06/14/2014  11:06 AM    <SYMLINK>      t2 [test]
    06/14/2014  11:06 AM    <SYMLINK>      t3 [test]
    06/14/2014  11:05 AM                 0 test
                   4 File(s)             22 bytes

那么,在CYGWIN中查看符号链接时,我该如何确定它是哪种类型的?当我使用rsync同步这些符号链接时,CYGWIN会在目标位置创建与环境变量中设置的相同类型的符号链接。我希望保留rsync'd目标中的符号链接类型,或者至少浏览源文件夹,找出其类型并在目标位置更改它们。stat仅将它们报告为符号链接,并不知道其中的区别。 添加此部分,因为我讨厌“你为什么需要(或想要)那样做?”的答案: 为什么我要混合使用符号链接?我尝试将我的整体CYGWIN环境变量设置为CYGWIN=winsymlinks:nativeCYGWIN=winsymlinks:nativestrict,但在某些软件包安装期间(主要使用apt-cyg),我在一些软件包的提取TAR中遇到了错误,所以我将其排除在外,并且只在需要时调用CYGWIN=winsymlinks:native(如果Windows需要跟随链接)。我认为软件包从最初的CYGWIN setup.exe安装为cygwin符号链接,因此全局设置该值将在以后创建问题。我也曾经将CYGWIN=winsymlinks:nativestrict设置为实际创建了一个“/usr/bin/”文件夹(可以在资源管理器中看到),但是cygwin将/bin挂载为/usr/bin,因此您会提取找不到的cygwin软件包。
还有一些符号链接,我不希望Windows知道或跟随。

3
运行Cygwin的setup.exe时,一些(很多)软件包的符号链接是从软件包的tar.xz文件中提取出来的。setup.exe有自己内部的解压代码,并不支持winsymlinks:native选项。另一方面,如果软件包在其postinstall脚本中(这是一个bash脚本)使用“ln -s”创建符号链接,那么如果将CYGWIN设置为winsymlinks:native,则会创建本机符号链接。 - Gene Pavlovsky
2
native 模式的一个奇怪问题是,如果您尝试创建指向不存在文件的符号链接(在某些情况下这是有意义的),Cygwin 会创建一个 Cygwin(非本地)符号链接。如果您使用 nativestrict 模式并尝试执行此操作,则 ln 将返回错误并无法创建任何类型的链接。因此,我从 nativestrict 切换到了 native - Gene Pavlovsky
@GenePavlovsky 谢谢!重要信息。 - Ivan Borshchov
有一种额外的符号链接类型,例如/bin/awk,它对Windows程序不可见。它们是什么? - philwalk
这是一个可能的额外符号链接类型的描述:https://stackoverflow.com/questions/63731443/why-are-some-cygwin-symlinks-not-visible-from-a-cmd-exe-session-why-do-they-exi - philwalk
1个回答

5

我最终写了一个脚本。在Cygwin中进行的测试是调用DOS命令并使用grep查找所需信息。

if fsutil reparsepoint query "$1" | grep -iq "Tag value: Symbolic Link" ; then
    echo "Windows Native Symlink"
fi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接