命令でドルを脱出しますか?

命令でドルを脱出しますか?

フローティングドッカーイメージを削除する必要がある非常に単純なシェルスクリプトがあります。コマンドは次のとおりです。docker rmi $(docker images -f "dangling=true" -q)

今私は原因と思われる問題に直面しました$。しかし、私が間違っている可能性があります。

私のスクリプトは次のとおりです

#!/bin/bash
cd /Users/jared/Projects
for d in ./*/ ;
do (cd "$d" && docker rmi $(docker images -f "dangling=true" -q); true); done

実行すると、画面に次のように印刷されます。

"docker rmi"には引数が1つ以上必要です。

「docker rmi --help」を参照してください。

使用法: docker rmi [オプション] IMAGE [IMAGE...]

1つ以上の画像を削除

私が下した家庭は、この$(docker imag...)キャラクターが当然$特殊キャラクターだからだ。

どのようにエスケープしたり、少なくとも私のスクリプトが望む方法で動作するようにすることができますか?

答え1

オペレーター$(...)といいますコマンドの置き換え、末尾の改行が削除されたコマンドの標準出力に拡張された出力。

引用符がなく、リストのコンテキストでは分割+glob(分ける)でのみ可能ですzsh

たとえば、cmd出力*:x\n\nにが$IFS含まれている:場合とリストコンテキストでは、およびに分割され、現在の$(cmd)ディレクトリのファイルリストに展開されます。*:x*x*

だから一般的に:

cmd1 $(cmd2)

$IFS(スペース、タブ、および改行)のデフォルト値は、のcmd1(スペース/タブ/改行区切り)パターンリストと一致するファイルリストに渡されることを意味しますcmd2

ここにエラーメッセージの出力を提供してください。cmd1、あなただと思いますcmd2何も出力しないか、空白、タブ、改行のみを出力します。これにより、引数はに渡されませんcmd1

したがって、この特別なケースを最初に処理する必要があるかもしれません。たとえば、次のようになります。

set -- $(docker images -f dangling=true -q)
[ "$#" -eq 0 ] || docker rmi "$@"

または、GNUまたはFreeBSDを使用してxargs次のようにします。

docker images -f dangling=true -q |
  xargs -r docker rmi

これはまた、出力ワードがdocker imagesファイルパターンとして扱われることを防止する。xargsコマンドに引数として渡されるスペースと改行で区切られた単語のリストを使用し、いくつかの形式の引用も理解します。各入力行にパラメータを渡すには、次のものを使用できます(GNUを使用xargs)。

docker images -f dangling=true -q |
  xargs -rd '\n' docker rmi

関連情報