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 ef8197f147fb
,c2ea2673f9e4
,4603059f1618
和40ad60328595
:在你的例子作为换行符是命令分隔符(如;
)此别名由四个命令取代这相当于
alias rmcons="docker rm -f ef8197f147fb
c2ea2673f9e4
4603059f1618
40ad60328595"
。其中最后三个不存在于您的系统上,因此“找不到命令”。这也意味着使用相同的输出docker ps -aq
- 因为它在别名definiton上 - 将被使用,而不会像运行别名时那样。另一方面,如果您使用单引号,则别名将实际上由您定义的确切命令替代:docker rm -f $(docker ps -aq)
。尽管docker ps -aq
仍然会用换行符返回输出,但这些换行符现在只是参数之间的解析字分隔符。
答
警告:未经测试。我不使用/有码头工人。
我认为你应该序列化输出首先“逃避”新行。
您也可以使用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
的rm
子命令有一个。
谢谢!刚刚运行过,它运行得很好,不知道这种差异 – alohamaloha