Qui s'occupe (interprète) le * dans
echo *
L'écho voit-il l'étoile ou le shell s'en occuper et renvoyer une liste de nom de fichier.
Qu'en est-il de
cp temp temp*
Qui s'occupe (interprète) le * dans
echo *
L'écho voit-il l'étoile ou le shell s'en occuper et renvoyer une liste de nom de fichier.
Qu'en est-il de
cp temp temp*
Réponses:
bash (ou tout ce que vous utilisez comme shell), est la première chose à lire n'importe quelle entrée, et commencera à interpréter les caractères spéciaux tels que ?
et *
. *
est étendu à toutes les correspondances dans le CWD , ce qui signifie que l'astérisque est remplacé par lesdites correspondances.
Dans la plupart des cas, c'est assez avancé, mais cela peut parfois conduire à des cas confus.
Considérer ce qui suit. Un répertoire a ce contenu:
Si vous tapez alors mv *
quelque chose qui semble bizarre, cela se produit: test3
est là, mais le reste a disparu. Bien que bizarre au début, cela a du sens une fois que vous comprenez à quoi bash passe réellement mv
. En raison de l'astérisque, bash interprète mv *
comme mv test test1 test2 test3
, et lorsque mv obtient cette liste, il supposera que le dernier argument est la destination, qui est l'endroit où tous les fichiers auraient été déplacés.
Quant aux commandes que vous avez listées:
echo *
peut fonctionner comme un pauvre ls
. Le shell étendra l'astérisque à tout ce qui se trouve dans ce répertoire, et comme je suis sûr que vous le savez déjà, echo
résonnera littéralement tout ce qui lui est passé en tant qu'arguments.cp temp temp*
se comportera un peu comme la mv
commande que j'ai décrite ci-dessus, à moins qu'il n'y ait qu'un seul répertoire nommé temp, auquel cas le nom de la source et de la destination est le même, c'est-à-dire qu'il ne fera rien.*
place de ls
. Par exemple, for f in *; do
est plus fiable que for f in $(ls)
si un nom de fichier contient un espace ou un caractère global. (Cependant, il échouera s'il n'y a pas de fichiers dans le CWD, vous devez donc vérifier ce cas.)
shopt nullglob
.
echo *
, cette astuce peut vous sauver dans certains cas.
Comme déjà indiqué, le shell se développe *
afin de echo
recevoir comme arguments tout ce que le shell trouve dans le répertoire courant. Cependant, notez que si l'expansion ne mène à rien, c'est-à-dire dans ce cas si le répertoire ne contient aucun fichier non caché, le *
reste inchangé et transmis tel quel à la commande appelée (sauf si des options non standard sont utilisées avec certains shells comme bash
.) echo *
ne va pas se comporter comme un pauvre ls
car le premier n'imprimera rien tandis que le second imprimera *
.
De même, cp /tmp/temp temp*
créera un fichier nommé temp*
dans le répertoire courant s'il n'y a pas encore au moins un fichier dont le nom commence par temp
.
Enfin, si vous souhaitez que le *
soit inchangé quel que soit le cas, vous pouvez le protéger de l'expansion à l'aide de guillemets simples, de guillemets '*'
doubles "*"
ou d'une barre oblique inverse \*
.
Dans Bash, le shell s'en occupe. Vous voyez que si vous essayez même *
sans écho
Remarque - sur la base de certains commentaires, je suggère lors de l'exécution de * ENTER, de créer un répertoire et d'utiliser la commande tactile pour créer certains fichiers, et assurez-vous qu'aucun d'entre eux, ou du moins assurez-vous que le premier par ordre alphabétique, n'est pas le nom de n'importe quel script ou commande dans le chemin.
$ *
bash: a: command not found
$ echo *
a a.aa a.ab a.b a.htm a.tx
Donc ls *
un peu un cliché
Sous Windows, *
est géré par la commande, ce dir *.*
n'est donc pas un cliché.
Remarque - En voyant certains commentaires, j'ajouterais, il y a un risque de courir * puis ENTER. Si vous avez un fichier appelé rm qui est le premier dans la liste des répertoires, il est dangereux car tout ce qui se trouve après serait supprimé. En outre, et cela est moins improbable, si le premier fichier dans la liste des répertoires est le nom d'un script dans le chemin d'accès, il l'exécutera.
rm
, bien sûr.
-rf
? J'ai essayé touch -rf
et touch \-rf
ça ne le crée pas.
-rf
? (Je comprends le danger d'un fichier appelé rm et d'un fichier appelé -rf, et le problème de taper * et de pousser enter dans un dossier important, je n'ai pas l'intention de le faire)
Le shell effectue plusieurs extensions avant que les arguments ne soient remis à la commande.
Voir aussi https://www.gnu.org/software/bash/manual/bashref.html#Simple-Command-Expansion
Pas spécifique à bash, voir http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_01