違いは何ですか
囲みオプション値のみを引用します。
たとえば、
grep --file="grep pattern file.txt" *
そして
オプション名とオプション値は引用符で囲まれています。
たとえば、
grep "--file=grep pattern file.txt" *
?
彼らは同じ結果をもたらします。
答え1
シェルの引用符とバックスラッシュは、特定の文字の特殊性を排除し、その文字が通常の文字として扱われるようにするために使用されます。
二重引用符の特別な点は、依然としてその中で拡張が可能であることです。つまり、その中でも$
、、\
は`
まだ特別です。また、これらの拡張機能のパフォーマンスにも影響します。
この行では、シェルの唯一の特殊文字は次のとおりです。
- シェル構文(多くの言語と同様)では、スペースは特に行、引数の場合は構文内の単語を区切るために使用されます。簡単なコマンド(これはシェルに知られているいくつかの構造の1つであり、主な構造です。)
- 末尾の改行文字は、何よりもコマンドを区切るために使用されます。
*
グローバルパターン演算子である単純なコマンドラインで引用されていない場合、これらの文字があれば次のような動作がトリガされます。ファイル名の生成またはワイルドカードまたはパス名拡張(POSIXフレーズ)。
他の文字はシェル構文では特に意味がありません。
ここで私たちが望むのは、シェルに/usr/bin/grep
次のパラメータを使用してファイルを実行させることです。
grep
--file=grep pattern file.txt
- そして、以下は現在の作業ディレクトリにあるファイルのリストです。
だから私たちは以下が欲しい:
- スペースこの間の単語区切り記号として扱われます。
- 新しいチームコマンドを定義する
*
グローバル演算子として扱われ、現在の作業ディレクトリに隠されていないファイルに展開されます。
したがって、上記の文字を引用しないでください。
しかし、そのうちの2つスペース私たちは、 に渡された2番目の引数に含めたいので、grep
引用符で囲む必要があります。したがって、少なくとも以下が必要です。
grep --file=grep' 'pattern' 'file.txt *
または:
grep --file=grep" "pattern\ file.txt *
(他の参照演算子の表示)
ここでは、シェルに固有の2つの文字だけを引用しており、そのように処理されることを望まない。しかし、私たちはこれを行うこともできます:
'grep' '--file=grep pattern file.txt' *
そして引用するみんなシェルが特別に処理したい文字以外の文字です。
特殊文字以外の文字を引用しても、シェルには何の影響もありません。
'g'r"ep" \-\-"file="'grep p'atte'\r\n\ file.txt *
ここでは、異なる形式の引用符を交互に使用しても同じ効果が現れます。
コマンドとオプション²名前にシェル特殊文字が含まれることはほとんどないため、引用しないことが慣例です。'ls' '-l'
代わりにofを使用している人はほとんど見えないので、orと比較すると特に違いがなくてもよく発生しますls -l
。grep --file="the value"
grep "--file=the value"
grep --file=the" value"
バラよりUnixシェルで通常の文字などの特殊文字を使用する方法は?どの文字が特別なのか、さまざまなシェルでこれを参照する方法の詳細についてです。
このコマンドにはまだいくつかの問題があります。
- 最初の拡張子のファイル名がで
*
始まる場合は、-
オプションとして扱われます。 *
タイプに関係なく、すべてのファイルを拡張します。これには、ディレクトリ、シンボリックリンク、fifo、デバイスが含まれます。次の種類のファイルだけを見たいと思うかもしれません。定期的な(または通常のファイルにシンボリックリンクできます)--file
GNU教義です。標準同等物はです-f
。*
1つのファイルにのみ拡張する場合、grep
ファイル名と一致する行は含まれません。- 一致するファイルがないと、
*
bash(デフォルト)を含む一部のシェルでは*
リテラル引数が渡されますgrep
(そしてその名前のファイルを開くことができないと文句を言うかもしれません)。
したがって、ここではzshシェルを例として使用して、次のように作成したいと思います。
grep -f 'grep pattern file.txt' -- /dev/null *(-.)
どこ:
-f
代わりに使用されます--file
。--
オプションが始まっても、後に続く他の引数はオプションとして1つと見なされないように終了します-
。- 常にファイル名が印刷されるように
/dev/null
少なくとも2つのファイルを渡す機能を追加しました。grep
- 私たちは単に見る
*(-.)
ために使用しますgrep
定期的な文書。一致するものがない場合はzsh
中止矛盾エラーが発生し、grepは実行されません。
/dev/null
に渡すので、一致するものがない場合は、エラーを報告して内部を調べるのではなく(自動的に失敗するのではなく)、globが何も拡張されないようにするglob修飾子()grep
も追加できます。N
*(N-.)
grep
/dev/null
while
1、などのシェル構文でキーワードを引用すると、シェルはそれを同様に認識できず、do
無効であるため、シェルはそれを変数の代入として扱うことができなくなり、影響を与える可能性があります。 (そして解析後に引用が行われます。)または、エイリアスを作成したり、引用した形式のエイリアスがない場合、エイリアスは拡張されません(この操作を許可するシェルはほとんどありません)。if
time
'v'ar=value
'v'ar
foo
\foo
f'oo'
-?
²Microsoftに触発されたユーティリティは時々注目すべき例外を発見します。
3 GNUの場合、grep
これは最初の引数だけでなく他の引数にも当てはまります。なぜなら、GNU grep
(そして現在他のいくつかのGNUのような実装)はオプションではなく引数の後でもオプションを受け入れるからです。