在不同的物理驱动器上执行符号链接

在不同的物理驱动器上执行符号链接

我的硬盘上有一个文件夹/media/kalenpw/HDD/Documents/ShellScripts,其中充满了我希望可以从任何目录访问的各种脚本。我之前的策略是将所有文件复制到此/usr/local/bin工作中,但在更新必须在两个地方更改的脚本时很乏味。

幸运的是,我最近了解了符号链接,它们是完美的选择。

我在我的主文件夹中制作了一个测试脚本

test.sh

print "Hello"

然后我就这么做了,就像预期的那样,我可以从任何地方ln ~/test.sh /usr/local/bin执行。test.sh

我遇到的问题是我更愿意将所有文档保存在我的硬盘上(在前面给出的目录中)。但是,您无法在驱动器之间链接,因此正如预期的那样,我收到了错误

跨设备链接无效

所以我尝试做一个像这样的符号链接:sudo ln -s ./test.sh /usr/local/bin/它创建了一个像预期的链接。但是,我无法test.sh像我希望的那样从任何目录(甚至根本)执行。为了确保文件不会失去链接权限,/usr/local/bin我做了sudo chmod +x ./test.sh并收到错误:

chmod:无法访问“./test.sh”:符号链接级别太多

我无法想象没有办法做到这一点,因为这似乎是一种常见用法,但我不知道如何做。

摘要:如何在不同的物理驱动器上创建从一个文件到另一个文件的链接,并且仍然保留执行链接文件的能力。

答案1

1) 访问大量脚本的正确方法是将脚本所在的目录添加到您的$PATH.例如,我在 中有我的个人脚本~/bin,所以在我的 中.profile,我有一行

export PATH=$HOME/bin:$PATH

这让我的~/bin 在前现有路径的,因此我可以通过具有相同名称的脚本来“覆盖”其他程序。如果您不想这样,请放置新目录 $PATH

因此,只需将您保存脚本的目录添加到您的路径中,您的问题就得到解决 - 完全没有符号链接。

2) 背景:在特定的文件系统上,文件是通过它们的标识来识别的索引节点号。目录只是将文件名映射到索引节点号。如果使用lnwithout -s(硬链接),则将使用现有文件的索引节点创建新的目录条目。因此,显然,这只能适用于同一文件系统上的文件。

OTOH,如果您使用ln -s,您将创建一个符号链接(symlink):一个特殊文件,其内容为您指定的路径,当您尝试访问它时,将使用此路径而不是文件。您无需成为 root 即可创建符号链接。

3)当你这样做时ln ~/test.sh /usr/local/binln命令会检测到这/usr/local/bin是一个目录,因此它假设你确实想要执行ln ~/test.sh /usr/local/bin/test.sh。同样的情况也发生在-s.记住这一点很重要,因为您还可以创建目录的符号链接。但只有 root 可以建立到目录的硬链接,因为您可以通过这种方式创建循环目录结构(并且 root 应该知道足够的知识来避免这样做)。

4) 虽然硬链接确实有文件模式位,但符号链接没有:任何对chmod符号链接的尝试都只会更改它指向的文件上的文件模式位。

5)我不知道当你无法执行时发生了什么test.shToo many levels of symbolic links错误消息表明你在某处有其他符号链接,所以有些事情搞砸了。我需要查看您的目录结构以了解发生了什么。

6)如果您确实想对脚本目录中的每个脚本进行符号链接,而/usr/local/bin/不仅仅是设置PATH(我不建议这样做),请考虑使用stow:此程序一次设置许多符号链接。man stow了解详情。

相关内容