web-dev-qa-db-fra.com

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

J'étais en train de déconner dans le terminal sous Red Hat Linux, et quand j'ai tapé l'astérisque (*) suivi de return, il a exécuté l'un des programmes de mon répertoire. Pourquoi?

Ma meilleure hypothèse est qu'Unix l'a traité comme un caractère générique, de sorte qu'il a exécuté le premier programme alphabétique. Puisque my_program.exe et one_of_my_programs.program peuvent être exécutés en tapant simplement le nom du fichier, l'opérateur générique représente tous les fichiers possibles. Comme un programme est d'abord alphabétique, Unix l'exécute. Est-ce un bon jugement?

21
user6086585

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 en cours est dans la liste PATH.

Quelques notes qui peuvent aider à comprendre: -

  • Si vous tapez ./*, l'entrée PATH n'est pas obligatoire.
  • Si vous tapez . * ou . ./* et que le premier fichier correspondant est un script, il n'a pas besoin d'être exécutable ni le répertoire en cours dans PATH (peut ne pas être vrai pour les shells autres que bash).
21
AFH

Cela suggère que . fait partie de votre variable PATH. C'est une très mauvaise idée pour des raisons de sécurité (bien entendu, Windows devait en faire un paramètre par défaut non modifiable).

Cependant, cette "suggestion" n’est que modérément valide: si vous avez un fichier nommé rm dans votre répertoire actuel, * exécutera correctement le 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 constater, ce n'est pas rm dans le répertoire actuel (fichier vide et non exécutable) qui a été exécuté, mais plutôt le /bin/rm par défaut du système.

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.

11
user777455