「ls *」コマンドが無効なオプションのエラーを生成するのはなぜですか?

「ls *」コマンドが無効なオプションのエラーを生成するのはなぜですか?

ファイルを表示しないという内容のスレッドがありますが、ls "*"実際にその理由を知りたいです。

ls *

このコマンドは私の端末に何も出力しません。

ls: invalid option -- '|'
Try 'ls --help' for more information.

しかし、

ls

現在のディレクトリのすべてのファイルを一覧表示します

 1                  ferol                      readme.txt
 2                  fichier                    sarku
 2018               GameShell                  Templates
 22223333          '-|h4k3r|-'                 test
 3                  hs_err_pid2301.log         test2
 CA.txt             important.top.secret.txt   toto.text
 CA.zip             JavaBlueJProject           tp1_inf1070
 countryInfo.txt    liendur                   'tp1_inf1070_A19(2) (1)'
 currency           liensymbolique             tp1_inf1070_A19.tar
 curreny            LOL                        Videos
 Desktop            Longueuil                 'VirtualBox VMs'
 Documents          Music                      words
 douffos            numbers                    Zip.zip
 Downloads          Pictures
 examples.desktop   Public

ここでワイルドカードが機能しない理由についてのアイデアはありますか?私はUbuntuにいてターミナルで働いていますが、これがどのような違いがあるのか​​わかりません。

ありがとうございます。

答え1

走るとき

ls *

ワイルドカードは通常どおり動作し、*次のような現在のディレクトリのすべてのファイル名に展開されます。

-|h4k3r|-

で始まる-ので、lsオプション(-aまたは-l)で構文解析してみてください。|これは実際に認識されるオプションではないため、lsエラーメッセージを表示してからinvalid option終了します(ファイルリストなし)。

現在のフォルダ内のすべての項目を明示的に一覧表示するには、次の手順を試します。

ls ./*

...これにより、すべてのファイル名にプレフィックスが追加されます./(アイテムがオプションとして誤って解釈されるのを防ぐため)。

ls -- *

...ここでは--「オプションの終わりを表す区切り文字」があります。残りの引数はファイル名です。

答え2

ここで欠けている重要な概念的な飛躍は、ワイルドカードが行われる場所だと思います。lsそれ自体はワイルドカード操作を実行しません。引数を指定しないと、ユーザーが意味するものを想定し、コマンドライン.で指定したディレクトリと同様にディレクトリが一覧表示されます。

ワイルドカード操作を実行するシェルです。その後、シェルは結果をコマンドライン引数として渡しますlslsその引数を入力したのか、グローバル拡張の結果であるのかはわかりません。したがって、他のコマンドライン引数と同様にフラグを解析します。

これはWindowsで動作する方法ではなく、Windowsがコマンドラインプログラムを処理する方法に大きな欠陥だと思います。

ここでもう一つの興味深いデモは、複数のディレクトリを含むディレクトリを作成することです。その後、これを実行すると、ls *シェルはこれらのすべてのディレクトリを引数として提供し、ls各ディレクトリのリストを提供します。これは.、引数を提供しないと仮定することが特別な動作ではなく単純な基本的な動作であることを示しています。

./*シェルがグローバル拡張を実行してすべてがシェルの前に*来ると、引数はオプションとして解釈されません。もしそうなら、オプションはオプションの処理を中止し、残りのすべての引数をリストする必要があるファイルまたはディレクトリとして処理する必要があることを意味します。したがって、IMHOはより良い選択です。./lsls -- *ls----

--ほとんどのUnixコマンドラインユーティリティはこの規則に従い、これはほとんどの言語用に書かれたほとんどの引数解析ライブラリの標準機能です。

答え3

通常、このコマンドはls *現在の作業ディレクトリ内のすべてのファイルとディレクトリを一覧表示する必要があります。現在直面している問題を引き起こす可能性がある2つの状況があります。

  1. このタイプのエラーは、ディレクトリに含まれるファイルに--2"or"という名前のディレクトリなど、サポートされていない文字が含まれている場合に-2発生します。たとえば、

    # ls -la | grep 2$
    drwxrwxr-x  2 test test    4096 Oct 28 14:58 --2
    # ls *
    ls: unrecognized option '--2'
    

    これは、で始まるファイル名がコマンドのオプション-として扱われるためです。ls

  2. そうでない場合は、ファイルにいくつかのエイリアスが設定されている可能性があります.bashrc。たとえば、エイリアスを設定すると無効なオプションが呼び出されるため、alias ls='ls –2'そのコマンドは使用できません。ls-2

答え4

これは「-|」というファイルがあるという意味です。シェル(bash、kshなど)が機能するため、すべてのワイルドカード式は現在のディレクトリの内容に対して評価されます。今後コマンドが呼び出されるので、次のコマンドがある場合-|ls *が呼び出され、ls file1 file2 ... -| ...このエラーが発生します。

削除または名前を変更する方法は、たとえば名前をmv './-|' xyzxyz

関連情報