GNU/Linux >> Linux の 問題 >  >> Linux

検索コマンドの '{}' と {} の違いは?

bash の場合 シェル、'{}' そして {} 交換可能です。これは、すべてのシェル (fish など) に当てはまるわけではありません。 ).

引数を一重引用符で囲むと、中括弧を find に送信する必要があることを明示的に示します .使用状況によっては、bash シェルが中括弧の内容を置き換えることがあります。

以下に示すように、bash は空の括弧を置き換えず、コマンドに渡されます。 find の場合 コマンド、それは問題ではありません。

$ echo {}
{}

$ echo {1}
{1}

$ echo {1,3}
1 3

$ echo '{1,3}'
{1,3}

ほとんどのユーザー (特に POSIX シェルを使用しているユーザー) にとって、違いはありません。

GNU find のマニュアルページの例のセクションによると :

<ブロック引用>

シェル スクリプトの句読点として解釈されないように、中かっこは一重引用符で囲まれていることに注意してください。

GNU のマニュアル ページの作成者は注意を怠っていると思いますが、マニュアル ページのすべての例で中括弧が引用されているわけではないことに注意してください。公式の GNU find ドキュメントからのこれらの例も、引用を省略しています。

POSIX / Single UNIX Specification の例では、括弧は引用されていません -exec で使用する場合 オプション。

POSIX シェルでは、中かっこで囲まれた特別なパラメータがある場合にのみパラメータ展開が発生しますが、空の中かっこではありません .

Bash シェルには (移植性のない) 機能としてブレース展開が含まれていますが、そのようなパターンは、コンマまたはドットがブレース内に含まれている場合にのみ展開されます。 . Bash はコマンドのグループ化にも中かっこを使用しますが、実際にある場合を除き、これは発生しません。 中括弧内のコマンドのグループ。

最後に、 find -exec ls -l {} \; を実行してみました sh で 、 dashtcsh しかし、これらのシェルはいずれも {} を展開しませんでした 他のものに。他の人が指摘したように、fish シェルは {} を扱います 特に、これは POSIX シェルではありません (その作成者とユーザーはこれを利点と考えています)。 中括弧を引用しても害はありません しかし、魚の殻を使わない怠惰なタイピストは、魚の殻を省略しても罪悪感を感じるべきではありません.


ほぼすべてのシェル インタープリターが利用可能であるため、'{}' の違いはまったくありません。 と {} .

単一引用符は通常、埋め込まれた文字列が別のものに置き換えられないように保護するために使用されます。例:

  • 'a b' 2 つの単一文字パラメーターになる引用符なしで、単一の 3 文字パラメーターです
  • '$b' a は文字通りドル記号の後に文字 b が続き、引用符なしで b 変数に含まれるものであり、設定されていない場合はおそらく何もありません
  • '!!' 引用符で囲まれていないリテラルな感嘆符であり、一部の対話型シェルでは、履歴に最後に入力されたコマンドに展開されます
  • '*' 文字通りのアスタリスクであり、引用符なしでは、現在のディレクトリ内の非表示でないファイル名のリストに置き換えられます。

POSIX 標準でも主流シェルでもない (sh (ボーン)、kshbashashdashzshcshtcsh ) {} を展開 他の何かに、引用符は必要ありません.

ただし、fish という名前のエキゾチックなシェルがあります。 、たまたま {} を展開します 空の文字列として、例:

> ps -p %self
  PID TTY          TIME CMD
 5247 pts/1    00:00:00 fish
> echo a {} b '{}'
a  b {}

それがおそらく GNU find の理由です ドキュメントは {} を保護することを提案しています 引用符またはバックスラッシュによる解釈に対して。


Linux
  1. ログインシェルと非ログインシェルの違いは?

  2. コマンドライン(bash)の「And」の違い??

  3. シェル変数と環境変数の使用法の違いは?

  1. EotとEofの違いは?

  2. [0-9]、[[:digit:]]とDの違いは?

  3. 配管とコマンド拡張の違いは?

  1. Linuxのlocateコマンドとfindコマンドの違いは何ですか

  2. sudo crontab -e と crontab -e だけの Linux の違い

  3. bashの&>と>&の違いは何ですか?