zsh的别名删除所有码头工人的容器返回命令没有找到

zsh的别名删除所有码头工人的容器返回命令没有找到

问题描述:

我有这个别名我.zshrc文件:zsh的别名删除所有码头工人的容器返回命令没有找到

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

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

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

如果使用双引号,比命令替换在定义别名$(docker ps -aq)进行评估。 docker rm -f ef8197f147fbc2ea2673f9e44603059f161840ad60328595:在你的例子作为换行符是命令分隔符(如;)此别名由四个命令取代这相当于

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

。其中最后三个不存在于您的系统上,因此“找不到命令”。这也意味着使用相同的输出docker ps -aq - 因为它在别名definiton上 - 将被使用,而不会像运行别名时那样。另一方面,如果您使用单引号,则别名将实际上由您定义的确切命令替代:docker rm -f $(docker ps -aq)。尽管docker ps -aq仍然会用换行符返回输出,但这些换行符现在只是参数之间的解析字分隔符。

+0

谢谢!刚刚运行过,它运行得很好,不知道这种差异 – alohamaloha

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

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


您也可以使用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子命令有一个。