web-dev-qa-db-fra.com

Pourquoi la commande "ls *" générerait-elle une erreur sur les options invalides?

Il y a un fil qui parle de ls "*" ne montrant aucun fichier, mais je me demande en fait pourquoi le simple

ls *

la commande ne produit rien dans mon terminal autre que

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

tandis que

ls

listera tous les fichiers dans les répertoires actuels comme

 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

Des idées sur la raison pour laquelle le globbing ne prend pas effet ici? Je suis sur Ubuntu, je travaille dans le terminal, je ne sais pas si cela fait une différence.

Merci.

34
MaelPJ

Quand tu cours

ls *

le globbing prend effet comme d'habitude, et le * s'étend à tous les noms de fichiers du répertoire courant - y compris celui-ci:

-|h4k3r|-

Cela commence par un -, donc ls essaie de l'analyser en option (comme -a ou -l). Comme | n'est pas réellement une option reconnue par ls, elle se plaint du message d'erreur invalid option, puis se ferme (sans répertorier aucun fichier).

Si vous souhaitez répertorier tout ce qui se trouve dans le dossier actuel de manière explicite, essayez plutôt

ls ./*

... qui préfixera tous les noms de fichiers avec ./ (afin que cette entrée ne soit pas mal interprétée en option), ou

ls -- *

...où -- est le "délimiteur indiquant la fin des options", c'est-à-dire. tous les arguments restants sont des noms de fichiers.

101
JigglyNaga

Je pense que l'important saut conceptuel qui manque ici est l'endroit où se fait le globbing. ls ne fera jamais de globbing lui-même. Si vous ne lui donnez aucun argument, cela suppose que vous vouliez dire . et répertorie ce répertoire comme tout répertoire que vous lui avez donné sur la ligne de commande.

La chose qui fait le globbing est le Shell. Le shell transmet ensuite les résultats sous la forme d'un ensemble d'arguments de ligne de commande à ls. ls n'a aucune idée si vous avez tapé ces arguments, ou s'ils sont le résultat d'une expansion globale. Et donc il les analyse pour les indicateurs comme il le ferait pour tout autre argument de ligne de commande.

Ce n'est pas ainsi que cela fonctionne sous Windows, ce qui, à mon avis, est une faille majeure dans la façon dont Windows gère les programmes de ligne de commande.

Une autre démonstration intéressante ici est de créer un répertoire contenant un tas de répertoires. Si vous faites alors ls * là, le Shell donnera tous ces répertoires comme arguments, et ls vous donnera une liste pour chacun d'eux. Cela montre simplement qu'en supposant . si vous n'avez pas fourni d'argument est un simple défaut, pas n'importe quel type de comportement spécial.

Si tu le dis ./* au lieu de * le Shell fera une expansion globale qui se traduira par tout ce qui aura ./ devant, donc ls n'interprétera aucun des arguments comme des options. Si tu fais ls -- *, ls interprète l'option -- comme signifiant qu'il devrait cesser d'essayer de traiter les options et traiter tous les autres arguments comme des fichiers ou des répertoires pour lesquels il devrait donner une liste. Alors, à mon humble avis, -- est le meilleur choix.

Le -- la convention est suivie par la grande majorité des utilitaires de ligne de commande Unix et est une fonctionnalité standard de la plupart des bibliothèques d'analyse d'arguments écrites pour la plupart des langues.

4
Omnifarious

Généralement, la commande ls * devrait répertorier tous les fichiers et répertoires de votre répertoire de travail actuel. Il y a 2 cas qui pourraient entraîner le problème auquel vous êtes confronté.

  1. Si l'un des fichiers contenus dans le répertoire contient des caractères non pris en charge, comme un répertoire nommé --2 "ou -2 entraînerait une telle erreur. Par exemple:

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

    En effet, le nom de fichier commençant par - sera considéré comme une option de la commande ls.

  2. Si ce n'est pas le cas, je pense qu'il peut y avoir un alias dans votre .bashrc fichier. Par exemple, si je définis l'alias alias ls='ls –2', Je ne pourrais pas utiliser la commande ls car elle appellera une option invalide qui est -2.

0
Not Named