【问题标题】:Assigning command to a variable in Zsh将命令分配给 Zsh 中的变量
【发布时间】:2021-02-27 02:43:43
【问题描述】:

我最近切换到 Zsh,我有一些配置 shell 文件想加载到 Zsh 中。但是,Zsh 似乎不允许通过字符串将命令分配给变量。

过去的工作原理

local git_conf='git config --global'
$git_conf rebase.autosquash true

在 Bash 中,上述工作正常。但是在 Zsh 中会打印出来:

command not found: git config --global

如果我只是将整个命令写在同一个文件中,它可以工作,但如果我将部分命令分配给一个变量,它就不会。有没有办法解决这个问题?

谢谢,

【问题讨论】:

  • @zedfoxus - 绝对可以。我也刚发现。我问得有点早,当我第一次遇到这个问题时,谷歌并没有给我最好的结果。巧妙的是,在 Zsh 中,我可以循环遍历字符串数组来分配这些配置。谢谢你!
  • 现在如果它适用于分配 git 函数:git config --global alias.coo '!f() { ... }' 那将是惊人的。
  • 进展顺利。我相信你会找到一种方法让你的工作流程变得很棒:)
  • @zedfoxus - 当然,我会用其他人的答案更新这个,以防他们先遇到我。希望你的工作流程很棒! :)
  • 关于 eval-is-evil-in-bash,请参阅 BashFAQ #48。它当然可以安全使用的,但要小心。

标签: zsh


【解决方案1】:

这实际上已经得到了回答。在我对谷歌进行尽职调查之前,我问得有点早。所以我会在下面给出我的答案。

解决方案

使用eval 函数将起作用。但这不是最佳实践。为了获得最佳实践,我使用的是 shell 函数。

在我的例子中,我有很多重复的配置,这些配置会简写一些打字,所以它不是那么冗长。在这种情况下,考虑到每个配置都有一个唯一的键,我进一步选择了一个关联的配置数组。

declare -A confs
confs=(
    rebase.autosquash true
    alias.a '!ga() {
        if [ $# -eq 0 ]; then
            git add .
        else
            git add "$@"
        fi
    }; ga'
)

for key value in ${(kv)confs}
do
  # this works, however I'd like to stay away from eval whenever possible
  # command="specific command that's always the same ${key} ${value}"
  # eval ${command}

  # best practice
  git_config ${key} ${value}
done

git_config() {
    git config --global "$@"
}

【讨论】:

    【解决方案2】:

    你也可以这样做:

    local git_conf=(git config --global)
    "$git_conf[@]" rebase.autosquash true
    

    【讨论】:

      【解决方案3】:

      您希望 shell 将您的“命令”拆分为空格。因此,您必须将其调用为

      ${(z)git_conf} rebase.autosquash true
      

      当然,这是对 shell 变量的误用,并且在这种简单的情况下有效。我想知道你为什么要在这里使用 shell 变量,而不是 - 比如说 - shell 函数。即使使用数组变量也会更加灵活。

      【讨论】:

      • 在 cmets 部分,有人告诉我最好使用 shell 函数。我已更改答案以反映最佳做法。
      • 好吧,不要使用卡车,如果您也可以使用自行车运输您的葡萄酒。当然,我们会尽量避免使用参数扩展来扩展为完整的命令(包括参数),但是您最初的问题是有效的,因为在某些情况下,函数确实无法为您带来进一步的帮助。实际上,如果你已经使用了一个函数,如果你可以把它变成一个单独的脚本,你也可以让它更加灵活。函数只能在定义它的 zsh 进程中执行,而脚本可以在任何地方运行。
      猜你喜欢
      • 2021-06-11
      • 1970-01-01
      • 2012-02-23
      • 1970-01-01
      • 2012-07-16
      • 2017-09-01
      • 1970-01-01
      • 2017-08-12
      • 2013-03-06
      相关资源
      最近更新 更多