“连接”符号链接

“连接”符号链接

Linux 是否能够使用“联合”符号链接?我不确定这是否是一个实际术语,所以让我解释一下这个概念。

我有一个 git 存储库,其中包含~/dotfiles.我使用到该目录的符号链接来“激活”它们。例如,通过执行ln -s ~/dotfiles/bash/bash_profile ~/.bash_profile来生成链接:

~/.bash_profile -> ~/dotfiles/bash/bash_profile

但是,我发现自己处于想要合并多个文件的内容的情况。例如,我希望~/.bash_profile符号链接指向两个单独的文件,每个文件一个。例如:

~/.bash_profile
(1) -> ~/dotfiles/bash/bash_profile
(2) -> ~/dotfiles/proj/bash_profile

我知道我可以简单地连接两个文件(例如,cat ~/dotfiles/{bash,proj}/bash_profile > ~/.bash_profile),但如果我可以使用符号链接做同样的事情,我更愿意这样做。

我想,如果存在这样的功能(Nix 相当大),那么在幕后它必须将两个不同的文件映射在一起,隐藏幕后的各种复杂性(映射所有非第一个“映射”的文件偏​​移量)文件,在写入连接的符号链接时锁定所有文件等)。

如果这样的功能不存在,是否有计划实现?

答案1

符号链接只是说“去其他地方寻找这个文件”。符号链接的内容与其目标的内容相同。所以不,符号链接不能做到这一点。我建议不要尝试寻找与符号链接相关的功能,因为您所追求的并不是。我不会理解你想要从“连接符号链接”这个术语中得到什么,即使在看到你想要什么之后我也不知道你为什么这么称呼它。

您希望文件的内容是多个文件内容组合的结果。这意味着系统的某些部分必须能够执行该组合,并且您必须描述您想要的组合类型(串联,如果我理解正确的话)。

现代 UNIX 系统有一种方法可以使任意数据显示为文件,而与存储方式无关:保险丝。使用 FUSE,对文件的每个操作(创建、打开、读取、写入、列出目录等)都会调用程序中的一些代码,并且该代码可以执行任何您想要的操作。请参阅创建一个实际上是命令的虚拟文件。你可以尝试一下脚本文件系统或者熔丝,或者如果您雄心勃勃,也可以自己动手。

对于这个用例,我不认为动态生成是正确的选择。它有点复杂,并且不会在任何地方都工作(FUSE 并不总是可供非 root 用户访问,并且在某些系统(例如 Windows)上根本不可用,即使使用 Cygwin 也是如此)。我建议您使用与我相同的方法:对于具有某种包含功能(.bash_profile.gitconfig、 …)的文件,使用该方法;对于其他文件,当您修改了其中一个组成文件时,请键入make(或您喜欢的任何构建系统)以重新生成应用程序读取的文件。

答案2

作为文本处理功能的模块化配置文件

您要求的是比文件处理更正确的文本处理,这在很大程度上取决于哪个程序正在使用文本文件。

执行您想要的操作的传统直接方法是拥有一个以模块化方式包含其他文件的顶级文件,例如:

〜/ .bash_配置文件:

source ~/dotfiles/bash/bash_profile
source ~/dotfiles/proj/bash_profile

一个好处是您可以注释掉行以进行临时更改,并且可以保持意图明显:

source ~/dotfiles/bash/bash_profile
# source ~/dotfiles/proj/bash_profile
source ~/dotfiles/proj2/bash_profile

使用符号链接目录管理脚本

但是,如果您确实想使用符号链接来管理配置文件集合bash,那么有一种行之有效的方法可以在现有符号链接之上使用很少的“粘合剂”来​​完成此操作。

尝试创建一个名为 (eg) 的目录,其中包含名称为(pointing to ) 和(pointing to )~/.bash_profiles的链接,然后将其放入 ~/.bash_profile 中:00base~/dotfiles/bash/bash_profile10proj~/dotfiles/proj/bash_profile

for file in ~/.bash_profiles/* ; do source $file ; done

然后,您可以通过操作符号链接来激活、停用和重新排序配置文件,而无需编辑任何文件。它之所以有效,是因为 bash 的扩展~/.bash_profiles/*是按词法排序的。

这本质上就是经典 Unix/Linuxinit管理系统启动脚本的方式。bash除非您有一组非常复杂的自定义项可以根据您正在处理的项目有选择地加载,否则这可能有点过分了。

相关内容