web-dev-qa-db-ja.com

誰が*エコーで*スターを扱いますか

誰が*を扱う(解釈する)

echo *

エコーは星を見るかシェルがそれを処理し、ファイル名のリストを返しますか?.

どうですか

cp temp temp*
15
faressoft

bash(またはシェルとして使用するもの)は、最初に入力を読み取り、_?_や_*_などの特殊文字の解釈を開始します。 _*_は [〜#〜] cwd [〜#〜] で一致するものすべてに展開されます。これは、アスタリスクが上記の一致で置き換えられることを意味します。

ほとんどの場合、これはかなり前向きなものですが、場合によっては混乱を招く場合があります。

以下を検討してください。ディレクトリには次の内容があります。

  • テスト(通常ファイル)
  • test1(ディレクトリ)
  • test2(ディレクトリ)
  • test3(ディレクトリ)

次に_mv *_と入力すると、奇妙に思われる何かが発生します。_test3_はありますが、残りはありません。最初は奇妙ですが、bashが実際にmvに渡すものを理解すれば意味があります。アスタリスクがあるため、bashは_mv *_を_mv test test1 test2 test3_と解釈し、mvがそのリストを取得すると、最後の引数は宛先であり、すべてのファイルが移動されたと見なされます。

リストしたコマンドについて:

  • _echo *_は貧乏人lsとして機能できます。シェルはアスタリスクをそのディレクトリ内の任意の場所に展開します。すでにご存じのとおり、echoは、引数として渡されたbashを文字通り単にエコーします。
  • _cp temp temp*_は、tempという名前のディレクトリが1つしかない場合を除いて、上で説明したmvコマンドのように動作します。この場合、ソースと宛先の名前は同じです。つまり、何もしません。
24
Jarmund

すでに述べたように、シェルは*を展開するので、echoは、シェルが現在のディレクトリで見つけたものを引数として受け取ります。ただし、展開しても何も起こらない場合、つまりディレクトリに隠しファイルが含まれていない場合、*は変更されずにそのまま呼び出されたコマンドに渡されます(非標準オプションがbashのような一部のシェル。)echo *は貧しい人のlsのようには動作しません。前者は何も出力せず、後者は*を出力します。

同様に、cp /tmp/temp temp*は、tempで始まる名前のファイルが1つもない場合、現在のディレクトリにtemp*という名前のファイルを作成します。

最後に、*を変更せずにそのまま渡す場合は、単一引用符'*'、二重引用符"*"、またはバックスラッシュ\*を使用して、展開から保護できます。

5
jlliagre

バッシュでは、シェルがそれを扱います。 *エコーなし

注-一部のコメントに基づいて、* ENTERを実行するときに、ディレクトリを作成し、touchコマンドを使用していくつかのファイルを作成し、それらのファイルがないことを確認するか、少なくとも最初のファイルがアルファベット順でないことを確認します。パス内のスクリプトまたはコマンドの。

$ *
bash: a: command not found

$ echo *
a a.aa a.ab a.b a.htm a.tx

そう ls *はちょっと決まり文句です

Windowsでは、*はコマンドによって処理されるため、dir *.*は決まり文句ではありません。

注-いくつかのコメントが表示されます。追加すると、実行してからEnterキーを押すリスクがあります。ディレクトリリストの最初にあるrmというファイルがある場合、それ以降は削除されるため危険です。また、この可能性は低くありません。ディレクトリリストの最初のファイルがパス内のスクリプトの名前である場合、そのファイルが実行されます。

4
barlop