【问题标题】:alias zsh: parse error near `do'别名 zsh:“do”附近的解析错误
【发布时间】:2018-10-19 08:21:36
【问题描述】:

我遇到了zsh 的别名问题。

我的.zprofile 文件中有这个别名:alias cleanimg="for i in `docker images | grep '<none>' | awk '{print $3}'`; do; docker rmi -f $i; done"

从我的终端运行 cleanimg 时,我收到此错误:zsh: parse error near `do'

我尝试在 do 关键字之后删除 ;,但它没有解决问题。 但是,如果我直接从终端执行代码,该别名会正确运行。

谁能帮我解决这个语法错误?

提前致谢。

【问题讨论】:

    标签: terminal alias zsh parse-error


    【解决方案1】:

    不要尝试为此使用别名;使用函数。

    cleanimg () {
      for i in $(docker images | awk '/<none>/ {print $3}'); do
        docker rmi -f "$i"
      done
    }
    

    这使您不必获得正确的引用,以便命令替换在别名被使用时运行,而不是在别名被定义时运行。

    (另外,grep | awk 管道几乎总是可以单独使用awk 来实现。)

    (我也想知道你是否可以放弃awk 和使用--filters 选项的循环;也许docker rmi -f $(docker images -q -f "dangling=true")?)

    【讨论】:

    • 您好,感谢您的回答!我将你的函数粘贴到.zshrc,重新启动我的shell,我收到以下错误:.zshrc:29: parse error near `done' 第二个done 似乎触发了语法问题。有什么想法吗?
    • 我猜这是一个错字,docker rmi 行上的done 不需要(for;do;done)
    • 是的,不知道我是怎么得到两个dones 的。可能复制了第一个,但没有注意到它在那里,所以输入了我自己的。
    【解决方案2】:

    如果你只想清理你的 docker 镜像,你可以像这样设置一个别名:

    alias cleanimg='docker rmi -f $(docker images -q -f "dangling=true")'
    

    子命令docker images -q -f "dangling=true" 返回所有要删除的 id,并且由于 docker rmi 接受参数,您可以直接传递它们

    【讨论】:

      【解决方案3】:

      您的 for 循环中有一个额外的分号,只需将其修复为 -
      alias cleanimg="for i indocker images | grep '' | awk '{print $3}'; do docker rmi -f $i; done"

      【讨论】:

      • 虽然没有必要,但额外的; 也不会造成伤害,删除它并不能解决问题。
      猜你喜欢
      • 2021-10-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-31
      • 2022-11-05
      • 2017-06-10
      • 2018-04-08
      • 2022-01-24
      相关资源
      最近更新 更多