linux 符号链接中的环境变量

s6fujrry  于 2023-04-05  发布在  Linux
关注(0)|答案(7)|浏览(128)

我们可以在符号链接中使用$HOME或其他环境变量吗?
我知道使用相对路径../../.config,但有时是很多../:)像~/.config这样的东西会更舒服,或者使用$HOME。
编辑:
habbie的答案与psmears的评论是答案,对不起我的问题是不完整的。
虽然(如其他答案所示)您可以在创建符号链接时使用环境变量(与任何shell命令一样!),但实际上在符号链接本身中不能使用环境变量(或“~”)引用

u0njafvf

u0njafvf1#

符号链接是由内核处理的,内核并不关心环境变量。

a1o7rhls

a1o7rhls2#

即使符号链接是由内核解析的,你仍然可以使用LD_PRELOAD技巧, Package 所有接受路径名的libc函数,并在'readlink'返回的字符串中展开任何$XYZ组件(参数展开)。然后将展开的路径提供给 Package 的函数。在创建链接时,你必须从shell展开中转义目标路径,正如jaztik所建议的那样。
由于注入的库具有对用户环境的完全访问,这将满足OP的所有期望。

khbbv19g

khbbv19g3#

是的。没问题。实际上你不会在你的链接中使用$HOME变量,所以它不会为用户组的智能解决方案工作。变量在执行命令时由shell翻译,变量的内容在链接中使用。

ln -s ~/test /tmp/test

扩展到

/<path>/<to>/home/test -> /tmp/test

啊。只有调用ln的人的环境变量才能工作。你不能在链接中存储其他人的环境变量。变量在调用命令之前被展开。

33qvvth1

33qvvth14#

如果你不想在链接中展开变量,你可以在它周围加上单引号,

ln -s '$HOME/file/or/folder' newname

这会给予

newname -> $HOME/file/or/folder

而不是让它扩展到你的本地设置$HOME。正如在其他答案中所描述的,它根本不会扩展它。所以你可以使用它来符号链接到文字$HOME文件夹中的文件。
[Note这取决于系统-并非所有系统都支持不同的符号链接]

inn6fuwd

inn6fuwd5#

我能做的最接近的是使用FUSE文件系统。使用fusepy来编写自定义的passthrough文件系统非常简单,它可以在确定要给予什么真实的的文件时读取环境变量。当然,它只获取挂载passthrough系统的进程的环境变量,所以它并没有那么有用。

bf1o4zei

bf1o4zei6#

我也遇到了同样的问题。在Linux(bash)上,我通过以下方式解决了这个问题:
首先将你要在命令行上执行的命令构造成一个字符串。用"引用(这将允许任何env变量展开)。然后使用eval命令来执行字符串,就像你键入它一样。
例如:

eval $(echo "ln -s $HOME myhomedir")

要将其拆分为单独的行:

export MYCMD=$(echo "ln -s $HOME myhomedir")
eval $MYCMD

希望这能帮上忙。

wi3ka0sx

wi3ka0sx7#

你可以的。

ln -s $HOME/file/or/folder newname

你也可以设置自己的变量并使用它们。添加.bashrc(或.bash_profile):

export $MYPATH=/your/path

相关问题