我们可以在符号链接中使用$HOME或其他环境变量吗?我知道使用相对路径../../.config,但有时是很多../:)像~/.config这样的东西会更舒服,或者使用$HOME。编辑:habbie的答案与psmears的评论是答案,对不起我的问题是不完整的。虽然(如其他答案所示)您可以在创建符号链接时使用环境变量(与任何shell命令一样!),但实际上在符号链接本身中不能使用环境变量(或“~”)引用
../../.config
../
~/.config
u0njafvf1#
符号链接是由内核处理的,内核并不关心环境变量。
a1o7rhls2#
即使符号链接是由内核解析的,你仍然可以使用LD_PRELOAD技巧, Package 所有接受路径名的libc函数,并在'readlink'返回的字符串中展开任何$XYZ组件(参数展开)。然后将展开的路径提供给 Package 的函数。在创建链接时,你必须从shell展开中转义目标路径,正如jaztik所建议的那样。由于注入的库具有对用户环境的完全访问,这将满足OP的所有期望。
khbbv19g3#
是的。没问题。实际上你不会在你的链接中使用$HOME变量,所以它不会为用户组的智能解决方案工作。变量在执行命令时由shell翻译,变量的内容在链接中使用。
ln -s ~/test /tmp/test
扩展到
/<path>/<to>/home/test -> /tmp/test
啊。只有调用ln的人的环境变量才能工作。你不能在链接中存储其他人的环境变量。变量在调用命令之前被展开。
33qvvth14#
如果你不想在链接中展开变量,你可以在它周围加上单引号,
ln -s '$HOME/file/or/folder' newname
这会给予
newname -> $HOME/file/or/folder
而不是让它扩展到你的本地设置$HOME。正如在其他答案中所描述的,它根本不会扩展它。所以你可以使用它来符号链接到文字$HOME文件夹中的文件。[Note这取决于系统-并非所有系统都支持不同的符号链接]
$HOME
inn6fuwd5#
我能做的最接近的是使用FUSE文件系统。使用fusepy来编写自定义的passthrough文件系统非常简单,它可以在确定要给予什么真实的的文件时读取环境变量。当然,它只获取挂载passthrough系统的进程的环境变量,所以它并没有那么有用。
FUSE
fusepy
bf1o4zei6#
我也遇到了同样的问题。在Linux(bash)上,我通过以下方式解决了这个问题:首先将你要在命令行上执行的命令构造成一个字符串。用"引用(这将允许任何env变量展开)。然后使用eval命令来执行字符串,就像你键入它一样。例如:
"
eval
eval $(echo "ln -s $HOME myhomedir")
要将其拆分为单独的行:
export MYCMD=$(echo "ln -s $HOME myhomedir") eval $MYCMD
希望这能帮上忙。
wi3ka0sx7#
你可以的。
ln -s $HOME/file/or/folder newname
你也可以设置自己的变量并使用它们。添加.bashrc(或.bash_profile):
export $MYPATH=/your/path
7条答案
按热度按时间u0njafvf1#
符号链接是由内核处理的,内核并不关心环境变量。
a1o7rhls2#
即使符号链接是由内核解析的,你仍然可以使用LD_PRELOAD技巧, Package 所有接受路径名的libc函数,并在'readlink'返回的字符串中展开任何$XYZ组件(参数展开)。然后将展开的路径提供给 Package 的函数。在创建链接时,你必须从shell展开中转义目标路径,正如jaztik所建议的那样。
由于注入的库具有对用户环境的完全访问,这将满足OP的所有期望。
khbbv19g3#
是的。没问题。实际上你不会在你的链接中使用$HOME变量,所以它不会为用户组的智能解决方案工作。变量在执行命令时由shell翻译,变量的内容在链接中使用。
扩展到
啊。只有调用ln的人的环境变量才能工作。你不能在链接中存储其他人的环境变量。变量在调用命令之前被展开。
33qvvth14#
如果你不想在链接中展开变量,你可以在它周围加上单引号,
这会给予
而不是让它扩展到你的本地设置$HOME。正如在其他答案中所描述的,它根本不会扩展它。所以你可以使用它来符号链接到文字
$HOME
文件夹中的文件。[Note这取决于系统-并非所有系统都支持不同的符号链接]
inn6fuwd5#
我能做的最接近的是使用
FUSE
文件系统。使用fusepy
来编写自定义的passthrough文件系统非常简单,它可以在确定要给予什么真实的的文件时读取环境变量。当然,它只获取挂载passthrough系统的进程的环境变量,所以它并没有那么有用。bf1o4zei6#
我也遇到了同样的问题。在Linux(bash)上,我通过以下方式解决了这个问题:
首先将你要在命令行上执行的命令构造成一个字符串。用
"
引用(这将允许任何env变量展开)。然后使用eval
命令来执行字符串,就像你键入它一样。例如:
要将其拆分为单独的行:
希望这能帮上忙。
wi3ka0sx7#
你可以的。
你也可以设置自己的变量并使用它们。添加.bashrc(或.bash_profile):