Quelle est la fonction de l'astérisque en tant que commande autonome sous Unix?

21

Je déconnais dans le terminal sur Red Hat Linux, et quand j'ai tapé l'astérisque ( *) suivi de retour, il a exécuté l'un des programmes de mon répertoire. Pourquoi?

Ma meilleure supposition est qu'Unix l'a traité comme un caractère générique et a donc exécuté le premier programme alphabétique. Étant donné que my_program.exeet one_of_my_programs.programpeut être exécuté en tapant simplement le nom du fichier, l'opérateur générique représente tous les fichiers possibles. Puisqu'un programme est d'abord alphabétique, Unix l'exécute. Est-ce un bon jugement?

user6086585
la source
Je pense que tous les shells ne trient pas l'expansion par *ordre alphabétique, mais bash en est un qui le fait.
aschepler
1
@aschepler: tous les shells conformes POSIX doivent; voir pubs.opengroup.org/onlinepubs/9699919799/utilities/… para 3.
dave_thompson_085

Réponses:

20

Votre interprétation est correcte. Le reste des fichiers sera présenté comme sa liste de paramètres.

Notez qu'il ne le fera que si le programme a le bit exécutable défini et que le répertoire courant est dans la PATHliste.

Quelques notes qui peuvent aider à comprendre: -

  • Si vous tapez, ./*l' PATHentrée n'est pas obligatoire.
  • Si vous tapez . *ou . ./*et que le premier fichier correspondant est un script, il n'est pas nécessaire qu'il soit exécutable, ni que le répertoire en cours se trouve dans PATH(peut ne pas être vrai pour les shells autres que bash).
AFH
la source
10
"il ne fera que ça ..." - Cela peut être plus intéressant. S'il y a une fonction shell, intégrée ou un exécutable antérieur PATHavec le même nom que le premier fichier, cette autre commande sera exécutée. mkdir foo; cd foo; touch rm xyz; ls; *; ls.
Kamil Maciorowski
@KamilMaciorowski - Juste point: ma déclaration "ça ne fera que ça ..." a précisé les conditions nécessaires , mais pas suffisantes . La commande se comportera également différemment s'il *s'agit d'un alias.
AFH
1
Conclusion: ne faites pas ça! Même si vous pensez pouvoir compter sur l'ordre alphabétique de l'expansion globale, notez que cet ordre dépend des paramètres régionaux.
Aaron
en plus . *ou . ./*on peut bash *(ou tout autre shell).
Olivier Dulac
11

Cela suggère que cela .fait partie de votre PATHvariable. C'est une très mauvaise idée pour des raisons de sécurité (naturellement, Windows a dû en faire un défaut non modifiable).

Cependant, cette "suggestion" n'est que modérément valide: si vous avez un fichier nommé rmdans votre répertoire actuel, *vous exécuterez bien la valeur par défaut rm :

/tmp$ mkdir ohno
/tmp$ cd ohno
/tmp/ohno$ 
/tmp/ohno$ ls
/tmp/ohno$ touch rm what
/tmp/ohno$ ls
rm  what
/tmp/ohno$ *
/tmp/ohno$ ls
rm
/tmp/ohno$ 

Comme vous pouvez le voir, ce n'était pas rmdans le répertoire courant (un fichier vide et non exécutable) qui a été exécuté mais plutôt par défaut du système /bin/rm.

Vérifiez toujours vos commandes lorsque des caractères génériques sont impliqués. Voici l'un des messages les plus terrifiants à lire:

rm: cannot remove '.o': No such file or directory

Ceci est le résultat de l'appel

rm * .o

, plus ou moins le pire emplacement d'un espace parasite que l'on puisse trouver.


la source
1
Cela ne fait pas de mal de créer une fonction rm()qui ajoute -iaux paramètres ou vérifie les paramètres et demande une confirmation s'il y a plus d'un certain nombre.
AFH
3
+1 pour "Voici l'un des messages les plus terrifiants à lire".
Mehrdad
+1 pour "C'est une très mauvaise idée pour des raisons de sécurité (naturellement, Windows a dû en faire un défaut non modifiable)."
Duncan X Simpson,
FTFY: mv /tmp/ohno /tmp/ohnoes( google.fr/search?q=ohnoes&source=lnms&tbm=isch )
Olivier Dulac
Il y a une bonne raison pour laquelle Windows en a fait un défaut non modifiable. Il doit maintenir une chaîne de compatibilité descendante depuis les jours précédant la mise en œuvre des répertoires DOS. Gardez à l'esprit que, à l'époque, personne utilisant un PC n'avait de disque dur, et les disquettes étaient suffisamment petites pour que les répertoires ne soient pas initialement considérés comme nécessaires.
Muzer