誰が星を扱う*エコー*


15

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

echo *

エコーは星またはシェルがそれを処理し、ファイル名のリストを返すことを確認します..

どう?

cp temp temp*

14
それは異なります。UnixシェルまたはWindowsシェル?
user1686

@grawity Unixシェル。すみません、私はそれについて言及しませんでした。
-faressoft

Unixの場合、以下の答えは正しいです。(Windowsでは、個々のプログラムによって実行されますが、通常はmain()の前にランタイムライブラリによって自動的に実行されます。)
user1686

回答:


24

bash(またはシェルとして使用するもの)は、入力を最初に読み取り、andなどの特殊文字の解釈を開始?*ます。CWD*一致するものすべてに展開されます。つまり、アスタリスクが前述の一致に置き換えられます。

ほとんどの場合、これはかなり困難ですが、ときどき混乱を招く場合があります。

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

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

その後、mv *一見奇妙に見える何かを入力するtest3と、そこにありますが、残りはなくなります。最初は奇妙ですが、bashが実際に何を渡すかを理解すれば意味がありますmv。アスタリスクのため、bashはmv *として解釈しmv test test1 test2 test3、mvがそのリストを取得すると、最後の引数が宛先であると仮定します。宛先は、すべてのファイルが移動された場所です。

あなたがリストしたコマンドに関して:

  • echo *貧乏人として機能することができますls。シェルはアスタリスクをそのディレクトリ内にあるものに展開しますが、既に知っていると思いますが、echo引数として渡されたbashを文字通りエコーするだけです。
  • cp temp temp*mvtempという名前のディレクトリが1つしかない限り、上記で説明したコマンドのように動作します。この場合、ソース名と宛先名は同じです。つまり、何もしません。

8
*代わりに使用することについて「悪い」ことは何もありませんls。例えば、for f in *; doある以上より信頼性の高いfor f in $(ls)ファイル名が空白またはグロブ文字が含まれている場合。(ただし、CWDにファイルがない場合は失敗します。そのため、そのケースを確認する必要があります。)
rici

1
@riciそれshopt nullglobが目的です。
からCVn

3
に関してはecho *、このトリックいくつかのケースであなた救うことができます
CVn

2
賛成:望ましくない切り替えをトリガーする任意のフォルダー内の「-」で始まるファイル。rm ./-stupidfileが機能することに気付くまで、それらを削除するのはそれほど楽しいことではありません。
ǝɲǝɲbρɯͽ

1
@ǝɲǝɲbρɯͽ-1024x-1024から1024x1024までの座標系での位置を表すファイル名を持つファイルを含むディレクトリの内容を削除する必要があるときに気づきました。それは私が最初にエスケープについて学んだときです。
ジャームント

5

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

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

最後に、*大文字と小文字を区別せずに渡したい場合は、単一引用符'*'、二重引用符、"*"またはバックスラッシュを使用して展開から保護できます\*


4

Bashでは、シェルがそれを処理します。あなたは、あなたもしようことがわかり*エコーなし

注-いくつかのコメントに基づいて、* 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
rmもちろん、という名前のファイルがある可能性があることに注意してください。
フォルカーシーゲル

1
-rfと呼ばれる...と別の1
ǝɲǝɲbρɯͽ

1
@ǝɲǝɲbρɯͽファイル名のファイルはあります-rfか?私が試したtouch -rfし、touch \-rfそれはそれを作成されていません。
-barlop

@barlop私は上記でコメントしました。gui(geditのような)はそれらをうまく処理しますが、シェル(少なくともbash)がこれを通過させるため、前に./が必要です。誤ってこのようなファイルを作成した場合、rmはヒントを試みますが、そうでない場合は、これが使い捨ての子を持つ一時フォルダーにしかならないことを願っています。
ǝɲǝɲbρɯͽ

@ǝɲǝɲbρɯͽ私はあなたが何を意味するのか全く理解していません-rf。(rmと呼ばれるファイルと-rfと呼ばれるファイルの危険性と、*を入力して重要なフォルダーで
Enterキー

-1

シェルは、引数がコマンドに渡される前にいくつかの展開を 実行します。

https://www.gnu.org/software/bash/manual/bashref.html#Simple-Command-Expansionも参照してください

bash固有ではありません。http ://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_01を参照してください


技術的にはあなたが書いていることは正しいですが、リンクがなければ、この答えは質問に答えるために実際には何もしません。関連する詳細を組み込むことを検討してください。
CVn

@MichaelKjörlingリンクに関することには同意しますが、OPは単にシェルまたはコマンド自体が引数を処理したかどうかを尋ねました。Glennの答えは、シェルがそれらを処理することを示しているだけなので、質問に対する受け入れられる答えです。
slhck

@slhckこれが、NAAとしてフラグを立てなかった理由です。リンクを削除した後、質問に対処する何かが残っています。これが私の意見では良い答えだという意味ではありません。(私の最初のコメントは別の方法で解釈される可能性があることがわかりました。そのため、申し訳ありませんが、それをそのままにしておくのに十分な価値があると思います。)
CVn

@MichaelKjörling同意しました。NAAとしてフラグを立て(そしてフラグを立てる)人のためにコメントを残しました。
-slhck
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.