【问题标题】:Shell variable expansion - indirection while calling a utility with envShell 变量扩展 - 使用 env 调用实用程序时的间接调用
【发布时间】:2010-01-09 18:32:53
【问题描述】:

我试图找出 env,(即用新环境调用 util)。

作为一个例子,我当前环境中的环境变量 KDEDIRS = /usr 假设我输入:

env -i KDEDIRS=/home/newkdedir env

这会按预期输出 KDEDIRS=/home/newkdedir(即用新环境调用第二个环境)

现在我想用同样的方式调用说实用程序 echo

env -i KDEDIRS=/home/new_kdedir echo ${KDEDIRS}

这显然行不通。 shell 在回显之前扩展 KDEDIRS。所以输出是/usr (即当前环境中的值)

然后我尝试间接并输入

env -i KDEDIRS=/home/newkdedir echo ${!KDEDIRS} 

这什么也不输出。

我可能对此有点困惑,但我怎样才能根据新创建的 echo 环境使 shell 扩展该 KDEDIRS 变量?

【问题讨论】:

  • 请注意,'-i' 选项意味着执行的命令不会设置任何环境变量,除了 KDEDIRS - 所以它不会找到不在默认 PATH 上的程序(或内置在 shell 中)等。

标签: linux bash shell environment-variables


【解决方案1】:

扩展是构建 env 命令行的一部分,该命令行也设置了变量。 在该命令的执行过程中不会进行任何扩展。因此,您必须添加另一个命令行扩展器作为该命令的一部分。例如

env -i KDEDIRS=/home/newkdedir /bin/sh -c 'echo $KDEDIRS'
KDEDIRS=/home/newkdedir eval 'echo $KDEDIRS'

间接与它无关。

【讨论】:

  • +1 是一个简洁的例子。在玩了一段时间的逃跑后,我放弃了。
  • 谢谢, sh -c 正如你所解释的那样作为另一个扩展器工作,但与 eval 的行对我不起作用。是因为上面乔纳森的评论吗?
  • eval 版本给了我:env: eval: No such file or directory
  • @Dennis:eval 是一个内置的 shell。 env 只执行 unix 可执行文件。这个例子是错误的。
  • @reinierpost :您可以编辑答案并取出评估部分吗?我不知道我是否可以编辑你的答案
【解决方案2】:

通常,您使用 `env' 为它产生的命令提供一个环境(例如,就像您在第一个 sn-p 中所做的那样)。可以通过一些不正当的转义和子shell技巧将变量打印回来(也可以使用shell内置),但这不是一个非常常见的用例(至少在我的经验中不是)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-08
    • 1970-01-01
    • 2013-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-02
    相关资源
    最近更新 更多