zsh别名删除所有docker容器返回命令未找到

时间:2017-07-06 15:21:21

标签: zsh zshrc

我在.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显示的所有容器?

2 个答案:

答案 0 :(得分:1)

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

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

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

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

由于换行符是命令分隔符(如;),因此该别名由四个命令替换:docker rm -f ef8197f147fbc2ea2673f9e44603059f161840ad60328595。最后三个在您的系统上不存在,因此"命令未找到"。它还意味着将使用与{别名定义 - 相同的docker ps -aq输出 - 而不是运行别名时的输出。

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

答案 1 :(得分:0)

  

警告:未经测试。我不使用/有码头。

我认为你应该首先序列化输出“转义”新行。

您也可以使用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开关在删除前提示确认。

我希望docker的{​​{1}}子命令有一个。