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.
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.
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.
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é.
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
.
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
.