2017-07-06 3 views
0

は私.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に表示されているすべてのコンテナを削除するにはどうすればよいですか?

答えて

1

二重引用符("")の代わりに一重引用符('')を使用する必要があります。

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

あなたは別名を定義するときコマンド置換$(docker ps -aq)が評価されることになるよりも、二重引用符を使用する場合。 docker rm -f ef8197f147fbc2ea2673f9e44603059f161840ad60328595:改行は(;のような)コマンドの区切りであるため、あなたの例では、これは、このエイリアスは、4つのコマンドで置換されている

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

と同等でした。最後の3つはシステム上に存在しないため、 "コマンドが見つかりません"。また、エイリアス定義の場合と同じ出力docker ps -aqが使用され、エイリアスの実行時と同じように使用されないことを意味します。

一方、一重引用符を使用すると、エイリアスは実際に定義した正確なコマンド(docker rm -f $(docker ps -aq))に置き換えられます。 docker ps -aqは改行で出力を返しますが、これらの改行は引数間の単語区切りだけが解析されるようになりました。

+0

ありがとうございます!ちょうどそれを実行し、それは完全に働いた、そのような違いについて知らなかった – alohamaloha

0

警告:テストされていません。私はドッカーを使用していません。

出力を最初にシリアル化して、新しい行をエスケープする必要があると思います。

ます。また、しようと、 forループを使用する場合があります

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

は、コマンドの出力を解析するためにバッククォートを注意してください。

ショートカットバッククォートの代わりに$()を直接使用することもできます。

私の代わりにrmを除去するecho最初にテストすることをお勧めします:

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

、および削除する前に確認を要求するようにその-iスイッチでrmを使用します。

私はdockerrmサブコマンドに1つがあります。