web-dev-qa-db-ja.com

コマンド "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で、ターミナルで働いています。違いが出るかどうかはわかりません。

ありがとう。

34
MaelPJ

あなたが走るとき

ls *

グロビングは通常どおり有効になり、*は現在のディレクトリ内のすべてのファイル名に展開されます。

-|h4k3r|-

これは-で始まるので、lsはそれをオプションとして解析しようとします(-a-lなど)。 |は実際にはlsによって認識されるオプションではないため、エラーメッセージinvalid optionが表示され、(ファイルをリストせずに)終了します。

現在のフォルダのすべてを明示的にリストしたい場合は、代わりに

ls ./*

...すべてのファイル名の前に./を付けます(そのため、エントリはオプションとして誤って解釈されません)、または

ls -- *

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

101
JigglyNaga

ここで欠けている重要な概念的飛躍は、グロビングが行われる場所だと思います。 lsは、それ自体でグロビングを行うことはありません。引数を指定しない場合は、.そして、コマンドラインで指定したディレクトリと同じように、そのディレクトリをリストします。

グロビングを行うのはシェルです。シェルは、結果を一連のコマンドライン引数としてlsに渡します。 lsは、これらの引数を入力した場合、またはそれらがグロブ展開の結果である場合、手掛かりがありません。そして、他のコマンドライン引数と同じように、フラグを解析します。

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

ここでのもう1つの興味深いデモンストレーションは、一連のディレクトリを含むディレクトリを作成することです。その後、ls *シェルでは、これらのディレクトリすべてを引数として提供し、lsはそれらの各ディレクトリのリストを提供します。これは、.引数を指定しなかった場合は、単純なデフォルトであり、特別な動作はありません。

あなたが言うなら ./* の代わりに *シェルは、すべての./その前にあるので、lsは引数をオプションとして解釈しません。もしあなたがそうするなら ls -- *lsはオプションを解釈します--これは、オプションの処理を中止し、残りの引数をすべて、リストを提供するファイルまたはディレクトリとして扱う必要があることを意味します。だから、私見、--がより良い選択です。

--慣習には、ほとんどのUnixコマンドラインユーティリティが続き、ほとんどの言語用に作成されたほとんどの引数解析ライブラリの標準機能です。

4
Omnifarious

通常、コマンドls *は、現在の作業ディレクトリ内のすべてのファイルとディレクトリを一覧表示する必要があります。あなたが直面している問題につながる2つのケースがあります。

  1. --2または-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が必要になるためです。

0
Not Named