man find

man find

はい

{}私は最近開いている中括弧と閉じた中括弧の間に何もせずに中括弧のペアをコマンドまたはオプションの引数として使用する例を見つけました。

cat foo | xargs -I{} echo {}

find . -size 0 -exec rm -i {} \;

文書なし

私の問題は、ドキュメントが見つからないということですGNU バッシュマニュアル{}上記の例の文脈で使用法を説明します。

私の考えではこれではないと思います。パラメータ拡張これは、パラメータ拡張では、に示すようにドル記号が中括弧の前にある必要があるためです${}

それは一つになることはできません。支柱の拡張どちらかは、および{x..y[..incr]}オプションではなく形式を取るためです。xy

また、それコマンドのグループ化またはforが{}パラメータとして使用されます。

質問

  1. {}一般に、中括弧のペアは、これを許可するコマンドの引数として何を意味しますか?

  2. asパラメータの使い方を説明する文書はどこにありますか{}

答え1

この中かっこは bash で予約されており、findそれぞれxargsとマニュアルページで説明されています。

man find

-exec 注文する ;

実装する注文する;戻り状態が0の場合は真です。 findの次の引数は、次の引数が;見つかるまでコマンドの引数として扱われます。文字列は、{}一部のバージョンと同様に、別の引数だけでなく、コマンド引数に現れるすべての場所で処理される現在のファイル名に置き換えられますfind\このオプションの使用方法の例については、例のセクションを参照してください-exec。指定済み 注文する一致する各ファイルに対して一度実行します。このコマンドは起動ディレクトリで実行されます。この操作では回避できないセキュリティ上の問題があるため、-exec このオプションを使用する必要があります-execdir

-exec 注文する {} +

このジョブのバリアントは-exec指定されたジョブを実行します。注文するただし、コマンドラインは、選択した各ファイル名を最後に追加することによって作成されます。コマンドの総呼び出し数は、一致するファイルの数よりはるかに少なくなります。コマンドラインは、xargsそのコマンドラインとほぼ同じ方法で構築されます。{}このインスタンスはコマンドに 1 つだけ許可されます。このコマンドは起動ディレクトリで実行されます。エラーが発生するとfindすぐに終了する可能性があるため、保留中の一部のコマンドがまったく実行されない可能性があります。このバリアントは-exec常にtrueを返します。

-execdir 注文する ;

-execdir 注文する {} +

に似ています -execが、指定されたコマンドは通常、検索を開始したディレクトリではなく、一致するファイルを含むサブディレクトリで実行されます。これは、一致するファイルへのパスを解析する際に競合状態を回避するため、コマンドを呼び出すより安全な方法です。-exec アクションと同様に、フォームは複数の 一致するファイルを処理するためのコマンドラインを作成+-execdir ますが、指定されたコマンド呼び出しは同じサブディレクトリに存在するファイルのみを一覧表示します。このオプションを使用する場合は、$PATH環境変数が参照されないようにする必要があります.。それ以外の場合は、攻撃者が実行するディレクトリに適切な名前のファイルを残して、必要なコマンドを実行できます-execdir。項目が$PATH空である場合、または絶対ディレクトリ名でない場合も同様です。エラーが発生するとfindすぐに終了する可能性があるため、保留中の一部のコマンドがまったく実行されない可能性があります。ジョブの結果は、そのジョブが使用されている+かバリアントが使用されているかによって異なります。;-execdir 注文する {} +常に true を返しますが、-execdir 注文する {} ;次の場合にのみtrueを返します。注文する0を返します。

man xargs

-I 交換-str

発生の交換交換-str初期引数では、標準入力から名前を読み込みます。また、引用符のないスペースは項目を終了せず、代わりに区切り文字は改行文字です。意味-xします-L 1

-i[交換-str]、--replace[=交換-str]

このオプションの同義語は次のとおりです。-I交換-strもし交換-str指定されました。もし交換-str欠落しているパラメータは同じ効果を持ちます-I{}。このオプションは廃止されました-I。代わりに使用してください。

編集:そしてここなぜbash は中かっこを無視します。

man bash

{ リスト; }

リスト 現在のシェル環境で実行できます。 リスト改行またはセミコロンで終了する必要があります。これをグループコマンドと呼びます。戻り状態はリストの終了状態です。メタ文字とは異なりそして){そして}は予約語なので、予約語認識が許可されている場所に表示する必要があります。単語の分離を引き起こさないので、スペースやその他のシェルメタ文字でリストと区別する必要があります。

強調するには:リストは改行またはセミコロンで終わる必要があります。

関連情報