`echo test?`は`test2`を印刷しますが、`ls test?`は何も印刷しません。

`echo test?`は`test2`を印刷しますが、`ls test?`は何も印刷しません。

私は最近bash globbingで遊んで、次のことを見つけました。

まず、2つのディレクトリを作成します。

$ mkdir test
$ mkdir test2

それから:

$ echo test?

出力(正しい):

test2

しかし:

$ ls test?

何も出力されません...

ただし、もう1つのディレクトリ(test3)を作成すると、期待どおりechoに機能しますls

なぜこれが起こるのか知っている人がいますか?

答え1

基本から理解してみましょう。

mkdir test
touch file
mkdir test1
mkdir test2

?単一の文字のみを検索します。

今コマンドを実行すると、ls tes?出力はfile

ディレクトリにファイルを作成するので、うまくいきます。マニュアルページlsから

NAME
       ls - list directory contents

ディレクトリには内部構造がtestあるため、コマンドは実際にディレクトリにあるファイルを一覧表示します。filels

それでは、次のようにファイルを作成しましょう。

touch ramesh
ls rames?
ramesh

上記のコマンドが機能する理由は、ファイルが存在し、ramesh現在のディレクトリに存在するためです(workによると、ディレクトリの内容を一覧ls表示し、実際に現在のディレクトリにファイル名がありますramesh)。

それでは、次のような名前のディレクトリを作成してみましょうram1

mkdir ram1
ls ram?

上記は何も出力しません。これはram1、現在ディレクトリにファイルがないためです。という名前の別のディレクトリを作成しようram2とすると、ram1まずディレクトリにファイルがあることを確認してから、ディレクトリにファイルがram2あるかどうかを確認します。lsソートの役割を覚えてください。

内部動作について詳しく知りたい場合は、statコマンドを実行してください。

この場合、stat ram?次のような出力が生成されます。

  File: `ram1'
  Size: 4096            Blocks: 8          IO Block: 4096   directory
Device: 805h/2053d      Inode: 6743976     Links: 2
Access: (0755/drwxr-xr-x)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2014-06-30 18:17:06.000000000 -0500
Modify: 2014-06-30 18:17:03.000000000 -0500
Change: 2014-06-30 18:17:03.000000000 -0500

関連情報