WSL Bash:如何让符号链接像本地文件夹一样运行

WSL Bash:如何让符号链接像本地文件夹一样运行

我设置了两个文件夹:

/
  folder/
    subfolder/
      file.txt
  symlink-folder/
    subfolder/ -> /folder/subfolder

如果我cd /symlink-folder/subfolder随后运行ls,就会看到file.txt,正如我所料。但是,如果我随后运行mv file.txt ..,就会得到以下结果:

/
  folder/
    file.txt
    subfolder/
  symlink-folder/
    subfolder/ -> /folder/subfolder

基本上,命令file.txt移至它是父目录,而不是我期望的 shell 的父目录。如果我运行pwd,我会看到/symlink-folder/subfolder。如果我运行cd ..,它会导航到/symlink-folder。这两者都按我的预期工作。

我该如何设置?

编辑:经过一些测试,如果我导航到/symlink-folder/subfolder然后运行vi ../file并保存,它也会创建一个文件在原始文件夹的父级中,而不是 shell 的父级中。看来符号链接本身的行为很奇怪,而不是使用它的命令。 cd有效,但任何其他命令似乎都不起作用。

答案1

请阅读为什么ls ..当我位于符号链接目录中时会显示真实的父内容?我的答案就在那里。然后这个答案关于cdpwd

mv像 your 、 yourvim或(在链接的问题中)这样的工具ls始终将其当前工作目录视为物理路径。如果它检查了$PWD从 shell 调用该工具时肯定应该在环境中的环境变量,它就可以知道逻辑路径。几乎不使用任何工具$PWD,所提到的工具没有,我们可以说不使用$PWD是常见的行为。

因此,对于您的mv ..意思是“身体的当前工作目录的路径”。

cd /symlink-folder/subfolder逻辑路径为,/symlink-folder/subfolder但物理路径为/folder/subfolder。对于任何不使用 的工具来说$PWD ..意味着/folder。只有使用 的工具$PWD才会将..其视为/symlink-folder

为了mv按您的需要工作,您需要使用$PWD一种或另一种方法。您可以$PWD以某种方式进行解析和/或使用使用该变量的工具。shellcd中的内置命令pwd(可能是内置命令或单独的可执行文件)就是这样的工具。

例如mv file.txt ..你可以这样做:

(cd -L .. && mv subfolder/file.txt .)

(我在这里使用了子 shell,因此主 shell 的当前工作目录不会改变)。这里cd -L ..使用了$PWD,但你的大脑也必须解析$PWD才能知道在 前面添加什么字符串file.txt。这种解析可以自动化,但相当麻烦。如果这是一次性工作,那么我认为用大脑进行解析是正确的做法。

或者你也可以这样做:

mv file.txt "$(cd -L .. && pwd)"

这里cd -L ..使用并根据逻辑路径$PWD将子shell(执行命令替换的 insisde)放入。然后打印当时的工作目录(我认为最终它是还是并不重要)。这种方法不需要您手动(或者更确切地说是用大脑)进行解析。..pwdpwd -Lpwd -P$PWD

另一种解决方案是直接$PWD作为字符串进行操作:

mv file.txt "${PWD%/*}/"

${PWD%/*}$PWD扩展为不包含最后一个斜杠的内容以及其后的所有内容(删除最小后缀模式,这里)。这会转换/symlink-folder/subfolder/symlink-folder。但是,如果当前工作目录是/,则结果将是一个空字符串,这是错误的;因此我将一个后置,/并且在的情况下,/我将得到/(这很好,因为/..方法/)。在我们的例子中,/symlink-folder/subfolder我得到的结果是与被(由)解释为目标目录时/symlink-folder/一样好。/symlink-foldermv

此方法对于任何来说都应该表现良好$PWD。应该始终包含不带或组件的$PWD绝对路径(否则可能导致方法行为异常)。...

答案2

你似乎描述了一种非标准行为。手册页 符号链接(7) 说:“mv(1) 和 rm(1) 命令不遵循以参数命名的符号链接,而是分别尝试重命名和删除它们”。

您可能能够使用两个命令来解决此问题: cp符号链接和rm原始命令。

如果的实现cp遵循手册页,那么的以下参数cp可能会有所帮助:

-d     same as --no-dereference --preserve=links

-P, --no-dereference
          never follow symbolic links in SOURCE

相关内容