【问题标题】:Environment variables in symbolic links符号链接中的环境变量
【发布时间】:2010-10-08 08:20:09
【问题描述】:

我们可以在符号链接中使用 $HOME 或其他环境变量吗?

我知道使用相对路径 ../../.config,但有时会使用很多 ../ :) 像 ~/.config 这样的东西会更舒服,或者使用 $HOME。

编辑:

habbie's answer with psmears's comment 是答案,抱歉我的问题不完整。

虽然(如其他答案所示)您可以在创建符号链接时使用环境变量(与任何 shell 命令一样!),但实际上您不能在符号链接本身中有环境变量(或“~”)引用

【问题讨论】:

  • 我希望这是可能的。一个用例:您在 ~/bin 目录中有一堆符号链接,这些符号链接指向例如克隆到 $HOME/my_github_scripts 的个人 git 存储库中的脚本。您想从几台机器上的~/bin 目录链接到这些脚本,但您的用户名不同。因此,您不想硬编码用户名(在我的家用计算机上可能是 /home/joebloggs,但在工作时可能是 /home/jbloggs,甚至在 Mac 上可能是 /Users/joebloggs)。
  • 如果想尝试一些异国情调的东西,你可以看看 ROFS Filtered。

标签: linux unix shell


【解决方案1】:

符号链接由内核处理,内核不关心环境变量。所以,没有。

【讨论】:

  • 不确定是谁在不发表评论的情况下修改了这个 - 答案是正确的。虽然(如其他答案所示)您可以在 创建 符号链接时使用环境变量(与任何 shell 命令一样!),但实际上在符号链接中不能有环境变量(或“~”)引用本身。
  • 您能否在内核中链接相关的源文件?
  • 遗憾的是,这对所有 Unixen 来说并不正确,因为在 1990 年左右至少有一个 Unix 版本可以在每次使用链接时完全按照动态描述的方式解释符号链接中的变量。一种常见的用途是使用 NFS 文件系统将 $ARCH 放入符号链接中,以指向异构集群中的 bin 目录。
【解决方案2】:

即使符号链接由内核解析,您仍然可以使用 LD_PRELOAD 技巧,包装所有采用路径名的 libc 函数,并在“readlink”返回的字符串中展开任何 $XYZ 组件(参数展开)。然后将扩展路径提供给包装函数。正如 jaztik 建议的那样,在创建链接时,您必须从 shell 扩展中转义目标路径。

由于注入的库可以完全访问用户的环境,这将满足 OP 的所有期望。

【讨论】:

    【解决方案3】:

    是的。没问题。实际上,您实际上不会在链接中使用 $HOME 变量,因此它不适用于例如针对用户组的智能解决方案。变量在执行命令时由shell翻译,链接中使用变量的内容。

    ln -s ~/test /tmp/test 
    

    扩展为

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

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

    【讨论】:

    • 我刚刚在 Centos 盒子上试过这个,thomasmalt 写的是正确的。该变量将在创建符号链接时进行转换,如果您更改环境变量,则不会动态更新。
    【解决方案4】:

    如果您不想扩展链接中的变量,可以在其周围加上单引号,

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

    这会给,

    newname -> $HOME/file/or/folder
    

    而不是将其扩展到您本地设置的 $HOME。如其他答案中所述,它根本不会扩展它。所以你可以例如使用它符号链接到文字 $HOME 文件夹中的文件。

    [请注意,这取决于系统 - 并非所有系统都支持变体符号链接]

    【讨论】:

    • 我很好奇你能不能说出一个的系统? :)
    • 我似乎可以在 OS X 10.9 上做到这一点。
    • @JacobEvelyn 刚刚在 OS X 10.9 上试过。它正确地将环境变量名称存储在链接中 (/tmp/currenthome -&gt; $HOME) - 但无法成功解析链接目标。 (-bash: cd: /tmp/currenthome: No such file or directory)
    • Apollo 上的域/OS(我认为 Alpha 上的 DEC/Ultrix)有不同的符号链接。他们既美好又有点噩梦 :-)
    【解决方案5】:

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

    【讨论】:

      【解决方案6】:

      是的,你可以。

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

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

      export $MYPATH=/your/path
      

      【讨论】:

      • 查看 thomasmalt 的回答。您所说的内容本身是正确的,但问题在于将环境变量存储在链接中,以便每次访问链接时都会查询环境(这是不可能的)。
      • 我认为这个回复并没有真正理解问题的上下文。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-06
      • 1970-01-01
      • 2013-02-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多