【问题标题】:zsh run a command stored in a variable?zsh 运行存储在变量中的命令?
【发布时间】:2012-11-19 20:26:25
【问题描述】:

在 shell 脚本中(在 .zshrc 中),我试图执行一个命令,该命令作为字符串存储在另一个变量中。网络上的各种消息来源说这是可能的,但我没有得到我期望的行为。可能是命令开头的~,也可能是sudo的使用,我不确定。有任何想法吗?谢谢

function update_install()
{
    # builds up a command as a string...
    local install_cmd="$(make_install_command $@)"
    # At this point the command as a string looks like: "sudo ~some_server/bin/do_install arg1 arg2"
    print "----------------------------------------------------------------------------"
    print "Will update install"
    print "With command: ${install_cmd}"
    print "----------------------------------------------------------------------------"
    echo "trying backticks"
    `${install_cmd}`
    echo "Trying \$()"
    $(${install_cmd})
    echo "Trying \$="
    $=install_cmd
}

输出:

Will update install
With command: sudo ~some_server/bin/do_install arg1 arg2

trying backticks
update_install:9: no such file or directory: sudo ~some_server/bin/do_install arg1 arg2
Trying $()
update_install:11: no such file or directory: sudo ~some_server/bin/do_install arg1 arg2
Trying $=
sudo ~some_server/bin/do_install arg1 arg2: command not found

【问题讨论】:

  • 你可以使用zsh -c '${install_cmd}'

标签: shell scripting zsh


【解决方案1】:

使用eval:

eval ${install_cmd}

【讨论】:

  • 不错,简单的方法。谢谢!
【解决方案2】:

正如§3.1 "Why does $var where var="foo bar" not do what I expect?" of the Z-Shell FAQ 中所解释的,您可以使用shwordsplit shell 选项告诉zsh 您希望它用空格分割变量并将它们视为多个单词。该页面还讨论了您可能要考虑的替代方案。

【讨论】:

    【解决方案3】:

    我相信您在这里有两个问题 - 第一个是您的 install_cmd 被解释为单个字符串,而不是带有 3 个参数的命令 (sudo)。

    您的最后一次尝试$=install_cmd 实际上确实正确地解决了该问题(尽管我将其写为${=install_cmd}),但随后您遇到了第二个问题:~some_server/bin/do_install 不是已知命令。这是因为出于安全原因,sudo 不会像您想要的那样解释 ~;它需要使用 shell 评估它的参数(或者为~ 做一些特殊情况,这实际上与sudo 无关),这会打开一整罐蠕虫,可以理解的是,sudo尽量避免。

    这也是为什么 eval ${install_cmd} 起作用的原因 - 因为这实际上将整个字符串视为要评估的东西,可能包含多个命令(例如,如果 install_cmd 包含 echo foo; sudo rm -rf / 它会很乐意擦除您的系统)。

    您必须自己决定是否希望 install_cmd 允许完整的 shell 语义,包括变量插值、路径扩展、多个命令等,或者是否应该只扩展单词并将它们作为单个运行命令。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-11-28
      • 1970-01-01
      • 2021-05-14
      • 2023-03-26
      相关资源
      最近更新 更多