2013-02-27 5 views
5

コードここ奇妙な振る舞い私は、次のしている私のシェルスクリプトで

echo * | tr ' ' '\n' 

は私が私が試した後 を(。*)私は*使っていたものの、それは隠しファイルをスキップしていることに気づきました明らかな変更

echo .* | tr ' ' '\n' 

これは私の隠しファイルの問題を解決しました。 。隠しファイルを含む]> [すべてのファイル

  • エコー - * *

    1. エコー*の望ましい出力のサブセットであるので、しかし、私は*

      のこの奇妙な振る舞いについてちょうど好奇心。* - >すべての隠しファイル

    2. エコー[^。] * - >すべての非隠されたファイルは、(現在はエコー*)

    は、したがって、[^。] *は、エコーのように動作されるエコー*

    私はエコーを使用して、隠しファイルを含むファイルのリスト全体を取得するにはどうすればよいです。 lsとdirの出力も同様でしたが、ls -aは望ましい出力を出していました。

  • +2

    '。*'は '*'のサブセット**ではありません。これはちょうど**補完的**(標準のPOSIXの動作を前提としています)です。 – Jens

    +0

    [^。] *は何ですか? – Kaunteya

    +0

    '[^。] *'は '*'と同じファイル名に展開されるので、サブセットでもありません。 – Jens

    答えて

    3

    パターンはファイル名展開、文字のために使用されている場合はこれがFilename Expansion

    で覆われている「」または直後にスラッシュを以下のシェルオプションがない限り、明示的に一致しなければならないdotglob設定されています。ファイル名をマッチさせる場合、スラッシュ文字は常に明示的に一致させる必要があります。他の場合、 '。'文字は特別に扱われません。

    あなたは*とともに.*を含めたい場合は、両方のパラメータが

    echo .* * | tr ' ' '\n' 
    

    をエコーや静止しかし...を除くdotglob

    shopt -s dotglob 
    echo * | tr ' ' '\n' 
    

    を使用して与えなければなりません。

    6

    シェルグロブ*は隠しファイルを無視するものとして定義されています。 .*は、のみを隠しファイルに展開します。

    一部のシェルでは、この動作をオプションで変更できます。例えば。 zshは、setopt dotglobが(POSIXへの)準拠しなくなり、デフォルトではglobドットファイルになります。 bashの場合は、shopt -s dotglobを使用できます。しかし、通常、globbingのためにPOSIXの動作を想定しているので、スクリプトが誤動作する可能性があることに注意してください。

    すべてのファイルを取得するには、エコーをglobbingと一緒に使用しないでください(例:find . -maxdepth 1)(エコーに嫌な人は、echo * .*を実行しますが、いずれかのファイルが一致しない場合、この場合、グロブパターンは保持されてもよい)。ファイル名の先頭に