gpt4 book ai didi

windows - Git Bash shell 无法创建符号链接(symbolic link)

转载 作者:行者123 更新时间:2023-12-01 19:54:24 26 4
gpt4 key购买 nike

当我尝试从 Git Bash 创建符号链接(symbolic link)时shell,每次都失败:

ln -s /c/Users/bzisad0/Work testlink

输出:

ln: creating symbolic link `testlink' to `/c/Users/bzisad0/Work': Permission denied

除了给出错误消息之外,它唯一做的就是创建一个名为(在本例中)teSTLink 的空目录。

我没有发现 ln 可执行文件有任何问题。例如,它归我所有并标记为可执行文件:

which ln
ls -hal /bin/ln

输出:

/bin/ln

-rwxr-xr-x 1 BZISAD0 Administ 71k Sep 5 11:55 /bin/ln

我还拥有当前目录(~,即 /c/Users/bzisad0):

ls -dhal .

输出:

drwxr-xr-x  115 BZISAD0  Administ      40k Sep  5 12:23 .

我拥有管理权限,并且我尝试使用“以管理员身份运行”打开 Git Bash shell,但这没有什么区别。

我尝试打开 ln.exe 的 Windows 属性并将权限级别设置为“以管理员身份运行此程序”,但这没有帮助。

我已进入 Windows 中的安全高级属性,并将自己(而不是管理员组)设为所有者,但这也无法解决任何问题.

我迷茫了。我不知道这个错误消息最终是来自 ln、Bash 还是 Windows,也不知道我怎么可能缺少权限。我怎样才能弄清真相?

最佳答案

尽管非常尴尬,但可以在 MSysGit 中创建符号链接(symbolic link)。 .

首先,我们需要确保我们使用的是 Windows。这是一个用于检查的示例函数:

windows() { [[ -n "$WINDIR" ]]; }

现在,我们不能做cmd /C ,因为 MSysGit 会与这个参数通奸并将其变成 C: 。另外,不要试图使用 /K ;仅当您没有 K: 时它才有效开车。

因此,虽然它将在程序参数上替换该值,但不会在此处文档上替换。我们可以利用这一点来发挥我们的优势:

if windows; then
cmd <<< "mklink /D \"${link%/}\" \"${target%/}\"" > /dev/null
else
ln -s "$target" "$link"
fi

另外:请注意,我包含了 /D因为我只对目录符号链接(symbolic link)感兴趣; Windows 就有这样的区别。通过大量的努力,您可以写出 ln() { ... }包装 Windows API 并作为完整的嵌入式解决方案的函数,但这...留给读者作为练习。

<小时/>

为了感谢您接受的答案,这里有一个更全面的功能。

# We still need this.
windows() { [[ -n "$WINDIR" ]]; }

# Cross-platform symlink function. With one parameter, it will check
# whether the parameter is a symlink. With two parameters, it will create
# a symlink to a file or directory, with syntax: link $linkname $target
link() {
if [[ -z "$2" ]]; then
# Link-checking mode.
if windows; then
fsutil reparsepoint query "$1" > /dev/null
else
[[ -h "$1" ]]
fi
else
# Link-creation mode.
if windows; then
# Windows needs to be told if it's a directory or not. Infer that.
# Also: note that we convert `/` to `\`. In this case it's necessary.
if [[ -d "$2" ]]; then
cmd <<< "mklink /D \"$1\" \"${2//\//\\}\"" > /dev/null
else
cmd <<< "mklink \"$1\" \"${2//\//\\}\"" > /dev/null
fi
else
# You know what? I think ln's parameters are backwards.
ln -s "$2" "$1"
fi
fi
}

另请注意一些事项:

  1. 我刚刚写了这篇文章并在 Windows 7 上进行了简要测试。和 Ubuntu ,如果您是 2015 年用户并使用 Windows 9,请先尝试一下。
  2. NTFS有重解析点和连接点。我选择重新分析点,因为它更多的是一个实际的符号链接(symbolic link),适用于文件或目录,但连接点的好处是成为 Windows XP 中的可用解决方案。 ,但它仅适用于目录。
  3. 某些文件系统,FAT特别是,不支持符号链接(symbolic link)。现代 Windows 版本不再支持从它们启动,但 Windows 和 Linux 可以挂载它们。

奖励功能:删除链接。

# Remove a link, cross-platform.
rmlink() {
if windows; then
# Again, Windows needs to be told if it's a file or directory.
if [[ -d "$1" ]]; then
rmdir "$1";
else
rm "$1"
fi
else
rm "$1"
fi
}

关于windows - Git Bash shell 无法创建符号链接(symbolic link),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18641864/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com