Si je cours ls -a
user@users-MacBook-Pro:~$ ls -a
. ..
Je reçois .
et ..
(répertoire actuel et répertoire parent?)
Y a-t-il une raison pour laquelle ils se présentent après ls -a
, font-ils quelque chose d'intéressant?
Parce que -a
signifie montrer tous les fichiers. Il est utile quand combiné avec -l
. Pourquoi montrer ces fichiers inutiles lorsqu'il n'utilise pas -l
, en raison de la cohérence, et parce que UNIX n'essaie pas de doubler ce qui est bon pour vous.
Il y a une option -A
(pour au moins GNU ls
) qui exclut ces deux (..
, et .
).
Fait intéressant, l'idée de fichiers cachés dans UNIX est venu à propos d'un bogue dans ls
où il essayait de cacher ces deux fichiers. Pour rendre le code simple, la mise en œuvre originale n'a vérifié que le premier caractère. Les gens utilisaient cela pour masquer des fichiers, il est ensuite devenu une fonctionnalité et le -a
Option a été ajoutée pour afficher les fichiers cachés. Plus tard quelqu'un se demandait, le même que toi, pourquoi .
et ..
sont montrés, nous savons qu'ils sont là. Les -A
option est née.
Remarque: UNIX a une signification beaucoup plus lâche que vous ne l'aurez peut-être.
Fichier ⊇ {Fichier normal, répertoire, nommé-tuyau, socket Unix, lien symbolique, périphériques}.
Comme y a-t-il un point pour eux montrant là-haut?
Ils montrent la propriété et les autorisations. C'est souvent la chose la plus importante à vérifier lorsque vous avez deux utilisateurs et on dit qu'ils ne peuvent pas voir le dossier de l'autre personne qu'elles s'attendaient.
Comme indiqué dans https://ss64.com/bash/ls.html lorsque vous ajoutez le -a
Paramètre à ls
[.____] Vous obtenez toutes les entrées, même celles qui commencent avec .
; Ils sont considérés comme des entrées cachées et non montrées avec un simple ls
.
Y a-t-il une raison pour laquelle ils se présentent après
ls -a
?
Je parie une suppose que c'est juste un accident historique, comme beaucoup de choses sont.
Selon A Histoire par Rob Pike, des fichiers "cachés" (dotfiles) ont été créés par quelque chose d'un accident:
Il y a longtemps, comme la conception du système de fichiers UNIX a été élaborée, les entrées
.
et..
est apparu, pour faciliter la navigation. Je ne suis pas sûr mais je crois que..
Entré dans la réécriture de la version 2, lorsque le système de fichiers est devenu hiérarchique (il avait une structure très différente au début). Lorsque l'on a dactylographiéls
, cependant, ces fichiers sont apparus, de sorte que Ken ou Dennis ajoutent un test simple au programme. C'était en assembleur alors, mais le code en question était équivalent à quelque chose comme ceci:if (name[0] == '.') continue;
Cette déclaration était un peu plus courte que ce qu'elle aurait dû être, ce qui est
if (strcmp(name, ".") == 0 || strcmp(name, "..") == 0) continue;
mais bon, c'était facile.
Deux choses ont résulté.
[...] Deuxièmement, et bien pire, l'idée d'un fichier "caché" ou "dot" a été créée. En conséquence, plus paresseux Les programmeurs ont commencé à supprimer des fichiers dans le répertoire de la maison de tous.
Basé sur cela, cela ne semble pas extrêmement extrait de deviner que ls -a
a ensuite été ajouté pour montrer les dotfiles créés par ces programmeurs paresseux. Et la simple mise en œuvre pour cela serait simplement désactiver le test ci-dessus à son tour, ce qui a entraîné .
et ..
montrant, encore une fois.
Indépendamment de l'histoire, le montrer est le comportement spécifié dans le standard Maintenant:
-une
[.____] Ecrivez toutes les entrées d'annuaire, y compris celles dont les noms commencent par une <période> ('.').
Mais il y a aussi ls -A
Pour faire la chose légèrement Saner. Je ne sais pas combien de plus récent que l'on est:
-UNE
[.____] Ecrivez toutes les entrées d'annuaire, y compris celles dont les noms commencent par une <période> ('.') Mais à l'exclusion des entrées DOT et DOT-DOT (si elles existent).
Est-ce qu'ils font quelque chose d'intéressant?
Les énumérer avec de la plaine ls
n'est pas très intéressant.
Mais cherche par exemple .
dans /path/subdir
donne la même inode que chercher subdir
dans /path
. La propriété et les autorisations du contrôle de répertoire qui peuvent accéder aux fichiers là-bas, de sorte que les informations puissent être agréables à disposer de .
, trop. Cependant, on peut toujours faire ls -ld .
ou ls -ld /path/subdir
s'ils ont besoin des propriétés du répertoire lui-même.
Cette option ls
nécessite d'afficher tous les fichiers avec ls -a
...
Mais l'existence physique de .
et ..
Dans la plupart des systèmes de fichiers est un artefact des années 1970, lorsque des ordinateurs ont été très minuscules et que les gens ont essayé de trouver des implémentations qui n'ont besoin que d'une petite taille de code. Cela a permis de faire des liens difficiles vers le répertoire actuel et du répertoire parent.
Depuis plus de 30 ans, cela est considéré comme une erreur.
En fait, l'UNOS (le premier clone UNIX de 1980) n'a pas eu .
et ..
, mon WOFS (la première copie sur l'écriture de fichier de fichiers) et les ZF ne les ont pas aussi.
Ce qui est requis par POSIX est juste pour gérer dir/.
et dir/..
Le moyen attendu, lorsqu'il est passé à SysCalls qui gère les noms de fichiers.
Malheureusement, la plupart des logiciels aujourd'hui sont toujours écrits et pénètrent dans des problèmes lorsque ces entrées sont manquantes, c'est pourquoi ZFS émule l'existence ....
En conséquence, il n'est pas spécifié si ls -a
imprime des lignes pour .
et ..
. Cela dépend du système de fichiers. Si vous êtes sur un système de fichiers qui n'inclut pas les entrées physiques pour .
et ..
Et cela ne prétend pas les avoir (comme ZFS), vous devez appeler: ls -ld . ..
BTW: POSIX a décidé récemment que echo .*
n'est plus nécessaire pour inclure .
et ..
, même quand ils existent physiquement. Une fois que tous les obus se comportent de cette façon, ce sera une grosse victoire.
Dans Unix (folklore l'a dit que par erreur) Noms de fichier/répertoire commençant par .
n'étaient pas montrés par ls
(parce que les noms .
et ..
avait été réservé à "ce répertoire" et "parent de ce répertoire" et leur montrant a été considéré comme un encombrement inutile). Ainsi, en utilisant ce peuple d'âge avancé a commencé à utiliser des noms comme .profile
ou .something-or-other-rc
(le RC est de la commande d'exécution, nom de fichier de démarrage pour un autre système de défunt long) pour les fichiers (et les répertoires) qui étaient "inintéressions". Ainsi ls -a
(show a ll), et bien sûr qu'il montrera .
et ..
comme la conception du système de fichiers UNIX a été élaborée, les entrées. et .. apparu, pour faciliter la navigation
Aucune réponse ne semble voir aucune utilisation dans ces entrées en premier lieu. Ils découlent en quelque sorte de la liste liée hiérarchique. "Navigation facile": pas avec ls
, mais avec un programme C utilisant ReadDir (3) ou.
Je crois .. Entré pendant la réécriture de la version 2, lorsque le système de fichiers est devenu hiérarchique
Y a-t-il une raison pour laquelle ils se présentent après LS -A, font-ils quelque chose d'intéressant?
A) Oui (raisons historiques/techniques) b) Oui, à moins que vous ne trouviez cd ..
Interest. (Ou en cliquant sur le fichier (pseudo) ..
Dans un navigateur de fichiers graphique)
(OK, ils n'ont pas à se présenter pour être utilisés ... C'est pourquoi c'est une option et il y a aussi -A
)
Même trouver le fait dans un dir vide:
]# find
.
Comme si cela je sais: trouver a trouvé quelque chose: rien.
]# stat . .. |grep Device
Device: 36h/54d Inode: 154051 Links: 6
Device: 803h/2051d Inode: 393219 Links: 26
]# cd /
]# stat . .. |grep Device
Device: 803h/2051d Inode: 2 Links: 18
Device: 803h/2051d Inode: 2 Links: 18
Cela définit le haut de la hiérarchie. Les direntries de. et .. sont identiques dans le premier dir /
. Et si vous ne le réalisez pas, un cd ..
est comme cd .
. Je ne reçois pas de message, ça marche/échoue silencieusement.
Seuls les champs d_name et (comme une extension XSI) d_ino sont spécifiés dans POSIX.1. Autre que Linux, le champ D_TYPE est disponible principalement sur les systèmes BSD.
struct dirent {
ino_t d_ino; /* Inode number */
off_t d_off; /* Not an offset; see below */
unsigned short d_reclen; /* Length of this record */
unsigned char d_type; /* Type of file; not supported
by all filesystem types */
char d_name[256]; /* Null-terminated filename */
};
La fonction READDIR () renvoie [un pointeur sur] une structure adressée représentant la prochaine entrée du répertoire dans le flux d'annuaire pointé sur by Dirp.
Sans champ de type, vous devrez regarder le contenu de l'inode avant de pouvoir indiquer le fichier ou le direct ou le tuyau. Et sans le .
et ..
, vous devriez stocker ces inodes dans une variable.
C'est ainsi que ces entrées peuvent simplifier la navigation, pour le script et l'utilisateur. Choix "1" le fait avec le répertoire actuel, prétendant .
est contenue dedans, comme un dir.
]# select ans in $(ls -af); do ls -l $ans; done
1) .
2) ..
3) child3
4) child2
5) child1
#? 1
total 0
drwxr-xr-x 2 root root 40 Feb 21 07:36 child1
drwxr-xr-x 2 root root 60 Feb 21 07:40 child2
drwxr-xr-x 2 root root 60 Feb 21 07:40 child3
#? 2
total 0
drwxr-xr-x 5 root root 100 Feb 21 07:36 myself
drwxr-xr-x 2 root root 40 Feb 21 07:37 sibling1
drwxr-xr-x 2 root root 40 Feb 21 07:37 sibling2
#? 3
total 0
-rw-r--r-- 1 root root 0 Feb 21 07:40 f.b
#? 4
total 0
-rw-r--r-- 1 root root 0 Feb 21 07:40 f.a
#? 5
total 0
(Ce serait plus intéressant s'il est cd
s puis répertorie le nouveau dir comme un choix de sélection, et ainsi de suite ...)
Y a-t-il une raison pour laquelle ils se présentent après LS -A, font-ils quelque chose d'intéressant?
Eh bien, ils apparaissent après LS -A car c'est la fonction de A commutateur sur LS. Vous avez demandé LS Pour vous montrer des fichiers commençant par un point, et c'est ainsi. J'ai peur qu'il n'y ait pas une meilleure réponse; C'est ce que A est pour.
La chose intéressante qu'ils effectuent est d'autoriser spécification relative chemin. Vous pouvez spécifier un emplacement de fichier relatif à la valeur par défaut actuelle plutôt que comme un chemin absolu de la racine. Ceci est très utile et être intéressant.
Personne ne semble avoir explicitement mentionné la prémisse de base des systèmes de type UNIX1:
Cela inclut les répertoires.
Depuis ls -a
répertorie tous les fichiers et les répertoires sont des fichiers, il est indiqué que .
et ..
serait inclus.
"Est-ce qu'ils font quelque chose d'intéressant?"
Oui, ils font. Ils vous donnent des références utiles; .
représente le répertoire actuel et ..
représente le répertoire parent. Cela vous permet de faire des choses comme mv /file/elsewhere .
et cd ..
. Bien sûr, c'est le pédantisme et vous saviez probablement déjà cela. :)
1 Bien que @ Ctrl-Alt-Delor, la réponse implique-elle.