用于删除所有 docker 容器的 zsh 别名 returns 未找到命令

zsh alias to remove all docker containers returns command not found

我的 .zshrc 文件中有这个别名:

alias rmcons="docker rm -f $(docker ps -aq)"

但是在尝试执行它之后,它只删除了一个容器,然后打印

$rmcons
ef8197f147fb
zsh: command not found: c2ea2673f9e4
zsh: command not found: 4603059f1618
zsh: command not found: 40ad60328595

如何删除 docker ps -aq 显示的所有容器?

Warning: untested. I don't use/have docker.

我认为你应该先序列化输出 "escaping" 新行。


您也可以使用 for 循环,尝试:

for id in `docker ps -aq`; do docker rm -f $id; done

注意反引号以解析命令的输出。

您也可以直接使用 $() 而不是它的快捷反引号。

我建议先用 echo 进行测试,而不是用 rm 删除:

for id in `docker -ps -aq`; do echo rm -f $id; done

,并使用 rm 及其 -i 开关在删除前提示确认。

我希望 dockerrm 子命令有一个。

您需要使用单引号 ('') 而不是双引号 ("")。

alias rmcons='docker rm -f $(docker ps -aq)'

如果您使用双引号,那么 命令替换 $(docker ps -aq) 将在您定义别名时进行计算。在您的示例中,这相当于

alias rmcons="docker rm -f ef8197f147fb
c2ea2673f9e4
4603059f1618
40ad60328595"

由于换行符是命令分隔符(如 ;),此别名由四个命令代替:docker rm -f ef8197f147fbc2ea2673f9e44603059f161840ad60328595 .最后三个在您的系统上不存在,因此 "command not found"。这也意味着将使用 docker ps -aq 的相同输出 - 就像在别名定义上一样 - 而不是 运行 别名时的输出。

另一方面,如果您使用单引号,别名实际上将被您定义的确切命令所取代:docker rm -f $(docker ps -aq)。虽然 docker ps -aq 仍会 return 输出换行符,但这些换行符现在只是解析参数之间的单词分隔符。