J'avais l'habitude ln
d'écrire des liens symboliques pendant des années mais j'obtiens toujours l'ordre des paramètres à l'envers.
Cela m'a généralement écrit:
ln -s a b
et puis en regardant la sortie pour me rappeler.
J'imagine toujours être a -> b
comme je le lis quand c'est en fait le contraire b -> a
. Cela me semble contre-intuitif, alors je me rends toujours compte de moi-même.
Quelqu'un a-t-il des conseils pour m'aider à retenir le bon ordre?
a
, et appelez-leb
"ln source target
. Même quecp source target
,mv source target
; ...Réponses:
J'utilise ce qui suit:
ln
a un formulaire à un argument (le second formulaire est répertorié dans la page de manuel ) dans lequel seule la cible est requise (car comment pourraitln
fonctionner sans connaître la cible) etln
crée le lien dans le répertoire en cours. La forme à deux arguments est un ajout à la forme à un argument, ainsi la cible est toujours le premier argument.la source
ln
.-t
), on a presque l'impression d'être une preuve. "ln
crée le lien dans le répertoire courant. La forme à deux arguments est un ajout à la forme à un argument et la cible est donc toujours le premier argument". Parce qu'il est logique que ce soit le cas lors de l'examen de la deuxième forme, je pense que cela m'aidera à m'en souvenir.Je passe par "
ln
est commecp
. La" source "doit venir en premier."la source
mv
.mv
,cp
Etln
tous prennent un fichier existant comme premier argument, et le fichier de destination ou le nom du répertoire comme deuxième argument.memcpy
,strcpy
etc. fonctionnent dans l'autre sens.memcpy(dest,src,n);
cartes très bien àdest = src;
. En d'autres termes, définissez (les premiersn
octets de) dest égal à (les premiersn
octets de) src.La plupart des Unices documentent la
ln
commande en tant que(J'omissionne des options, etc. ici)
Exemples:
Le standard POSIX
OpenBSD :
NetBSD et FreeBSD
macOS
Solaris
AIX
Le
ln
manuel GNU appelle lasource
cible et letarget
nom du lien .Manuel GNU pour
ln
Ignorant le choix de mots GNU, l'
ln
utilitaire suit le même type de sémantique que par exemplemv
etcp
en ce que la cible est ce qui est créé à partir de la source .Donc,
créerait le lien symbolique
b
pointant versa
.Notez également que lors de la création de liens symboliques , la source est simplement une chaîne représentant ce que le lien symbolique doit désigner. Il n’ya généralement pas de vérification faite pour confirmer que cela pointe sur quelque chose d’utile:
la source
ln -s a b
fonctionne. Cela n'a rien à voir avec la formulation de GNU, car je ne pense pas avoir déjà consulté le phrasé de la page de manuel. : D (C'est plus facile de courirln -si a b
quand on n'est pas sûr, ça va se plaindre si çab
existe déjà.)Au cas où cela aiderait quelqu'un: je me suis habitué à le considérer comme "ln quoi où ", ce qui m'aide à me rappeler que le premier argument ("quoi") est le fichier existant, le second ("où") est le lieu mettre (un lien vers). Contrairement au raisonnement de la plupart des autres réponses, ce n’est rien de plus qu’une phrase simpliste que je peux me réciter mentalement lorsque je tape une commande, qui sert d’aide à la mémoire. Cela ne sera probablement pas utile à tout le monde mais je pense que cela aidera certaines personnes.
Il est utile que les autres commandes de manipulation de fichier standard utilisent la même convention. Je peux donc faire de même pour
cp
etmv
.la source
J'ai récemment entendu une excellente façon de se souvenir de cette chose en particulier: une comptine
Le premier verset indique quels sont les arguments de ln: quelque chose d’ancien suivi du nom de la nouvelle entrée de répertoire.
la source
À partir de 1971 Unix First Edition Manuals .
Il existe une seconde forme simple, à syntaxe.
edit: je mets FILE ou FILENAME au lieu de Target --- voir les commentaires , etc. voir aussi très long ajout au fond, adressant l' iceberg, dur et doux de
ln
, non seulement la pointe de celui - ci.Donc, GNU
ln
a ceci:où vous n'avez pas besoin du nom du lien. Après avoir
ln -s /usr/lib/modules
obtenu unavec le même nom que FILENAME ("cible" ou "source"), là où vous êtes. Pas de choix, pas de confusion.
Maintenant, si vous êtes plus exigeant et souhaitez que le lien soit créé sous un autre nom et / ou ailleurs , vous ajoutez ce souhait sous forme de nom ou de chemin. La vraie cible vient en premier, le nouveau nom de lien extra fantastique en second.
Ou vous dites: "Je connais cette notation en forme
ls -l
de flèche pour les liens. Je n’ai pas de flèche dans la coque pour indiquer la direction de mon lien. Je dois donc le retourner."Vous le créez dans un sens, vous pouvez donc l'utiliser dans l'autre.
(FIN DE LA RÉPONSE DE LA PARTIE QUESTION)
Sur un autre plan, le mot "lien" porte lui-même une double signification cachée. Les liens symboliques sont venus plus tard, alors au début, un lien n'était qu'un lien. Il n'y avait pas de soft et hard, pas d'
-s
option. Et maintenant, j'utilise même le symbolisme source-cible:A ce stade, il y a des liens, mais pas de liens durs ou indirects, et
ls -l
ne montre pas de flèches, car il n'y a pas de direction dans un lien (dur). Un "lien" à ce stade d’évolution unix signifie que le nom de fichier "B" (entrée de répertoire "B") dans le système de fichiers pointe sur le même inode que le nom de fichier "A".Les fichiers A et B sont "liés" ensemble, car ils partagent les mêmes blocs. Alors maintenant, avec chaque rm, le noyau doit vérifier: est-ce que je supprime / libère les blocs de ce fichier sur le disque, ou y a-t-il un autre fichier lié aux mêmes blocs? Pour cela, un compteur de liens est utilisé.
Supposons que vous souhaitiez conserver un gros fichier sur / tmp et que vous le supprimiez
ln /tmp/bigfile
. Vous avez maintenant un gros bigfile dans votre répertoire de travail. Après avoir nettoyé / tmp et déplacé l'original, vous continuez à utiliser les mêmes blocs de données. Vous n'obtenez pas un lien mort ou en suspens, vous avez un fichier normal. Pointant sur aucun fichier mais uniquement sur le système de fichiers, comme le fait chaque entrée de répertoire. Seulement maintenant, "nettoyer" / tmp n’est plus aussi efficace qu’il l’était. Cela semble vide, et ça l'est, mais les blocs de la partition ne sont pas libérés.Même si un lien physique ne coûte pas l’espace lui-même comme cp, indirectement, il le peut.
Ajout
ln -s
à la séquence ci-dessus:Maintenant, "B", le lien symbolique, a seulement une chaîne avec un chemin d'accès. C'est info "soft". Techniquement, "A" et "B" ne sont pas liés. Mais toujours B est un "lien" dans le nouveau sens que vous pouvez utiliser ce chemin stocké comme raccourci vers "A". Maintenant c'est "un lien vers A" (point) et pas "lié à l'inode du fichier A"
Les deux types de liens peuvent confondre non seulement les humains mais aussi le noyau / fs. La page de manuel de 1971 disait: "BOGUES: les liens sont sauvegardés deux fois et restaurés sous forme de fichiers séparés avec des inodes distincts."
Les liens durs vers les répertoires (rares / non autorisés) peuvent facilement conduire à un encrassement.
Les liens symboliques vers les répertoires (très fréquents) peuvent conduire à des boucles éternelles - doivent être reconnus par les utilitaires / noyau.
Exemple pratique à bash
Commençant par un fichier régulier "F" ...
... donne à Fhard la même taille que F, mais ils apparaissent tous les deux dans un rouge foncé SANS les flèches
ls -l --color
. En raison destat
montrer "Links: 2" en relation avec "Inode: xyz". Liaison dure F transforme F en un lien dur. Les deux sont / restent un type de fichier "fichier normal". Mais les deux ont un inode avec un nombre de liens supérieur à 1.... crée un petit fichier "irrégulier" "Fsoft" avec un type de fichier "lien symbolique" - encore plus d'économie d'espace qu'un répertoire vide. A
ls -l
ne montre rien de spécial pour "F". Pour Fsoft, la taille indiquée est de 1 octet puisque la chaîne est 'F' etFsoft -> F
est affichée comme nom. Pas besoin de coloriser un lien virtuel pour en reconnaître un. Parce que dans la forme courte,ls -F
vous obtenez une chaîne enroulée@
:Fsoft@
Avec
ls -l
ça ressemble à ça:Fhard a la taille et le type de F.
Fsoft a le nom de F et la longueur du nom de F comme taille et un type de fichier différent.
Court
ls -sF
:l'ajout
--block-size=1
ne donne pas les mêmes tailles non plus. Fsoft a la taille "un octet, zéro bloc". F et Fhard dévient en parallèle:Pour voir si Fsoft est suspendu ou non,
ls
permet d'utiliser des couleurs.la source
Il est vraiment utile de se rappeler que le nom du lien est facultatif. S'il n'est pas indiqué, le nom de base du lien cible est utilisé.
est identique à supprimer complètement le nom du lien:
Cela n'aurait aucun sens si le lien cible était mentionné en dernier.
la source
Il suffit de penser Unix -> AT & T -> destination à droite:
la source
ln abc def
,abc
etdef
sont le même objet; ils sont indiscernables. De plus, l’opération n’a aucun effetabc
autre que l’augmentation du nombre de liens. La destination estdef
. Un pointeur sur l'objet est nouvellement installé à l'def
emplacement.ln -s abc def
cela signifie que le contenuabc
est écrit à l'emplacementdef
.abc
n'a même pas à résoudre à rien; cela peut être un lien qui pende.mv dest src
,ln [ -s ] dest src
,cp dest src
, ...Personnellement, je préfère éviter de me souvenir de X, plutôt que de savoir où chercher X lorsque j'en ai besoin. Je suis également fan de l'attitude "mieux vaut prévenir que guérir", donc j'aime toujours vérifier attentivement ce que j'écris, surtout en tant que root.
Dans ce cas, la réponse est littéralement dans les premières lignes de la page de manuel:
Je ne l'aurais pas suggéré s'il était nécessaire d'explorer la page de manuel, mais comme c'est juste au début, à mon humble avis, cela vaut les 3 secondes qu'il faut pour taper
man ln
et arrêter.la source
Semblable à cp, que je lis mentalement comme "copier ceci dans cela", je lis les commandes ln comme "lier ceci à cela".
la source
Voici comment je m'en souviens: oublie la cible. En d'autres termes, si je suis dans dir1 et que je veux créer un lien symbolique ici vers fichier1 qui existe dans / some / other / dir /, je ferais simplement:
Vous obtiendrez un lien symbolique appelé fichier1 dans rép1 qui pointe vers / une autre / autre / dir / fichier1. De la page de manuel de ln:
Gardez simplement à l'esprit que cela ne fonctionne que si vous souhaitez que le lien symbolique porte le même nom que la cible (ce qui est très probablement le cas).
la source
Je voudrais développer la réponse de @ gary.
En plus de son réponse: la
ln
commande peut accepter un nombre arbitraire d'arguments, ce qui vous permet de créer plusieurs liens symboliques en une seule invocation (ce qui est pratique lorsque vous en avez besoin).ln -s foo bar baz
, quelle est l'explication la plus logique que les arguments veulent dire quoi?ln -s foo bar
, quelle est l'explication la plus logique qui soit, quel argument veut dire quoi?la source
Imaginez une version de celle-
ln
ci vous permettant de créer plusieurs liens (symboliques) en une seule commande.Cela ne servirait à rien puisque inverser cela, puisqu'un lien symbolique ne peut pointer que l'
TARGET
un après l'autre et la convention normale de la ligne de commande est de mettre la partie répétée à la fin de la ligne de commande, par exemplegrep PAT [FILE]...
la source
"
ls
montrea -> b
siln a b
"Rappelez-vous simplement que c'est faux.
la source
ls -l
:link -> target
peut confondre votre idée de la configuration de laln
ligne de commande. Mais je crains que cela ne va pas aider beaucoup.