当我尝试从Git Bash shell创建一个符号链接时,它每次都会失败:
$ ln -s /c/Users/bzisad0/Work testlink
ln: creating symbolic link `testlink' to `/c/Users/bzisad0/Work': Permission denied
Run Code Online (Sandbox Code Playgroud)
除了提供错误消息之外,它唯一能做的就是创建一个名为的空目录(在本例中)testlink.
我没有看到ln可执行文件有任何问题.例如,它由我拥有并标记为可执行文件:
$ which ln
/bin/ln
$ ls -hal /bin/ln
-rwxr-xr-x 1 BZISAD0 Administ 71k Sep 5 11:55 /bin/ln
Run Code Online (Sandbox Code Playgroud)
我也拥有当前目录(~,即/c/Users/bzisad0):
$ ls -dhal .
drwxr-xr-x 115 BZISAD0 Administ 40k Sep 5 12:23 .
Run Code Online (Sandbox Code Playgroud)
我有管理权限,我尝试用"以管理员身份运行"打开Git Bash shell,但这没有任何区别.
我尝试打开Windows属性ln.exe并将权限级别设置为"以管理员身份运行此程序",但这没有帮助.
我已经进入Windows中的安全性 - >高级属性,并使自己(而不是管理员组)成为所有者,但这也没有解决任何问题.
我不知所措.我不知道这个错误消息最终是来自lnBash,还是来自Windows,或者我怎么可能缺少权限.我怎样才能深究这一点?
Cam*_*tin 65
尽管非常尴尬,但在MSYSGIT中创建符号链接是可能的.
首先,我们需要确保我们在Windows上.这是一个用于检查以下内容的示例函数:
windows() { [[ -n "$WINDIR" ]]; }
Run Code Online (Sandbox Code Playgroud)
现在,我们不能这样做cmd /C,因为MSYSGIT将使用此参数进行fornicate并将其转换为C:.此外,不要试图使用/K它,它只适用于没有K:驱动器的情况.
因此,虽然它将在程序参数上替换此值,但它不会在heredocs上.我们可以利用这个优势:
if windows; then
cmd <<< "mklink /D \"${link%/}\" \"${target%/}\"" > /dev/null
else
ln -s "$target" "$link"
fi
Run Code Online (Sandbox Code Playgroud)
另外:请注意我包含,/D因为我只对目录符号链接感兴趣; 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
}
Run Code Online (Sandbox Code Playgroud)
还要注意以下几点:
奖金功能:删除链接.
# 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
}
Run Code Online (Sandbox Code Playgroud)
Ton*_*gan 20
解决方法是mklink从Bash 运行.这也允许您创建符号链接或连接.
注意将mklink命令作为单个参数发送给cmd...
cmd /c "mklink link target"
Run Code Online (Sandbox Code Playgroud)
这是mklink... 的选项
$ cmd /c mklink
Creates a symbolic link.
MKLINK [[/D] | [/H] | [/J]] Link Target
/D Creates a directory symbolic link. Default is a file
symbolic link.
/H Creates a hard link instead of a symbolic link.
/J Creates a Directory Junction.
Link specifies the new symbolic link name.
Target specifies the path (relative or absolute) that the new link
refers to.
Run Code Online (Sandbox Code Playgroud)
如果你想通过GUI创建链接......我建议使用Link Shell Extension作为Windows资源管理器插件来创建符号链接,硬链接,连接点和卷挂载点.我已经使用它多年了!
如果您的系统C:驱动器上有一个较小的SSD驱动器,则符号链接可以节省生命,并且需要将一些不需要在SSD上的膨胀文件夹符号链接到其他驱动器上.我使用免费的WinDirStat来查找磁盘空间.
小智 19
对于我的设置,在Windows 8.1 export MSYS=winsymlinks:nativestrict上安装的Git for Windows 2.11.0可以解决这里所解释的问题:https://github.com/git-for-windows/git/pull/156
启动Git Bash shell非常重要作为管理员,在Windows上,只有管理员才能创建符号链接.因此,为了完成tar -xf工作并创建所需的符号链接:
export MSYS=winsymlinks:nativestrictAus*_*ngs 15
我相信lnmsysGit附带的内容只是试图复制它的参数,而不是简化链接.这是因为链接仅在NTFS文件系统上工作(类型),并且MSYS团队不想重新实现ln.
例如,参见http://mingw.5.n7.nabble.com/symbolic-link-to-My-Documents-in-MSYS-td28492.html
Cer*_*vEd 14
local security policiesLocal Policies/User Rights Assignment/Create symbolic links这授予您创建符号链接的权限。请注意,这将在下次登录时生效。
\n下一步是弄清楚如何ln配置:
env | grep MSYS\nRun Code Online (Sandbox Code Playgroud)\n我们正在寻找MSYS=winsymlink:哪个控制如何ln创建符号链接。
如果该变量不存在,请创建它。请注意,这将覆盖现有的MSYS环境变量。
\nsetx MSYS winsymlinks:nativestrict\nRun Code Online (Sandbox Code Playgroud)\n以管理员身份运行 shell 只是为了创建符号链接。
\n这个错误有点不言自明,但却难以捉摸。
\n您缺乏运行该命令的适当权限。
\n默认情况下,Windows 仅向管理员授予符号链接创建权限。
\nCygwin必须做一些歌舞来绕过 Windows 对符号链接的低劣处理。
\n某事,某事“安全”的东西
\n\xc2\xaf\\_(\xe3\x83\x84)_/\xc2\xaf
我刚刚意识到 OP 有管理员权限。我留下这个答案,希望对其他人有用。
\n扩展Camilo Martin 的答案,因为您需要使用 Windows 10 的 /j 参数开关;否则该调用将仅返回“您没有足够的权限来执行此操作”。
这适用于没有管理员权限的 Git Bash 2.20.1.windows.1/MINGW64 (Windows 10)(如果您可以读取/写入 /old/path 和 /link/path:
original_folder=$(cygpath -w "/old/path")
create_link_new_folder=$(cygpath -w "/link/path")
cmd <<< "mklink /j \"${create_link_new_folder}\" \"${original_folder}\"" > /dev/null
Run Code Online (Sandbox Code Playgroud)
小智 5
对于任何对如何在 Windows 10 Git Bash 2.28.0.0.1 中完成此操作感兴趣的人:
您必须在ln -s命令前面加上前缀,MSYS=..而不是export MSYS=..首先执行,即它只是一个命令:
MSYS=winsymlinks:nativestrict ln -s <TARGET> <NEW_LINK_NAME>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
37923 次 |
| 最近记录: |