Comme le titre l'indique, y a-t-il une différence pour les systèmes de fichiers * NIX? par exemple ls file
etls ./file
linux
filesystems
Sergey Alaev
la source
la source
Réponses:
Je ne suis pas fou de l'explication de SmallLoanOf1M. Il est techniquement correct mais répond d'une manière qui ne correspond pas à l'exemple d'utilisation de la question.
Donc, à titre d'exemple, voici une différence importante entre les deux de la question: "fichier" et "./fichier"
Que faire si le fichier est nommé avec un caractère analysé par le shell? Surtout en ce qui concerne les caractères interprétés par la commande que l'on exécute.
Plus précisément, le caractère "tiret": "-". Mais d'autres personnages ont un sens pour le shell.
Exemple. Mon fichier a été nommé "-dingle"
Essayez de répertorier le fichier:
Pire encore, que se passe-t-il si le fichier est nommé "
-rf rmbomb *
"? Maintenant, essayez de le supprimerJe ne vais même pas essayer d'exécuter cet exemple, mais j'espère que vous aurez l'idée.
Alors, comment listez-vous un fichier avec un tiret? Utiliser
./
devant.Idem pour
rm
la source
ls \-dingle
ouls \-rf\ rmbomb\ \*
. Cela peut être un bon moyen de s'assurer que tout ensemble de commandes donné est au moins cohérent, car spécifier./
avant un nom n'échappera pas aux caractères après le./
.rm "-rf rmbomb *"
cela ferait quelque chose de mal, au lieu de simplementrm
imprimer une erreur. C'est seulement dangereux si vous oubliez de citer le nom du fichier, donc le fractionnement de mots se produit. (en particulier dans un script shell où vous exécutez à larm $file
place derm "$file"
. Mais dans ce cas, le*
ne se développera pas, car l'expansion globale ne se produit pas sur le contenu de l'expansion variable. Si vous le souhaitez, vous auriez besoin d'uneval
.) Quoi qu'il en soit, si votre script divise les noms de fichiers avant de passer à rm, je créerais un fichier appeléspace -rf .
ou quelque chose, doncrm ./$i
ça n'aide pas.rm: invalid option -- ' '
, à partir du moment où il essaie d'interpréter l'espace après-rf
comme un commutateur à un seul caractère, car il fait partie du même argument. (Et oui, j'ai couru cela dans un répertoire vide juste au cas où j'aurais oublié quelque chose et que c'était en fait dangereux: P)IFS=''
et-f
respectivement. Un exemple plus rare est celui quiawk
traite un opérande (autre qu'un premier opérande qui est le script) ayant la formefoo=bar
comme une affectation à exécuter mais./foo=bar
comme un fichier à lire.Oui.
En émettant
file
sur la ligne de commande, BASH recherchera dans votre variable d'environnement $ PATH un fichier de ce nom. À moins que le fichier ne réside dans un répertoire de votre variable $ PATH, il ne sera pas trouvé..
signifie le répertoire courant../
signifie dans le répertoire courant, en termes relatifs. C'est l'équivalent de dire quelque chose comme/home/sheogorath/shivering/isles.img
lors de l'appel./isles.img
en travaillant dans le/home/sheogorath/shivering/
répertoire.En tant que tel, il est couramment utilisé pour exécuter des fichiers dans votre répertoire de travail "sur place".
EDIT: Dans votre exemple,
ls
est appelé par le shell et trouvé en utilisant la variable path. Son argument sera traité dans votre répertoire de travail, quel qu'il soit. Comme il s'agit de la valeur par défaut pourls
, vous ne verrez aucune différence entre la spécificationfile
et la spécification explicite./file
car elles pointent toutes les deux vers votre répertoire actuel.Toutes les commandes n'acceptent pas les chemins de fichiers dans le répertoire de travail, et certains s'attendent à ce que vous ayez des fichiers d'état dans un répertoire qu'ils ont eux-mêmes prédéfinis via la configuration. Parmi les commandes qui acceptent les fichiers comme arguments, ces commandes sont moins courantes
la source
ls
mentionnée dans la question d'origine. C'est plus la différence entre réaffecter un chemin relatif (par rapport au répertoire de travail actuel) Ie../../dir/filename
et un chemin absolu/path/to/dir/filename
ls
ils seront toujours le même chemin, l'un spécifié plus explicitement que l'autre. Toutes les commandes ne se comportent pas de cette façon lors du traitement des arguments, mais la plupart le font.