Ich habe ln
jahrelang symbolische Links geschrieben, aber die Reihenfolge der Parameter ist immer noch falsch.
Das bringt mich normalerweise zum Schreiben:
ln -s a b
und dann auf die Ausgabe schauen, um mich zu erinnern.
Ich stelle mir immer vor, a -> b
wie ich es lese, wenn es eigentlich das Gegenteil ist b -> a
. Das fühlt sich kontraintuitiv an und ich stelle fest, dass ich mich immer selbst nachdenke.
Hat jemand Tipps, die mir helfen, mich an die richtige Reihenfolge zu erinnern?
a
und nennen Sie esb
"ln source target
. Gleich wiecp source target
,mv source target
; ...Antworten:
Ich benutze folgendes:
ln
Hat ein Ein-Argument-Formular (2. Formular in der Manpage aufgeführt ), in dem nur das Ziel benötigt wird (wie könnte das überhauptln
funktionieren, ohne das Ziel zu kennen) undln
erstellt den Link im aktuellen Verzeichnis. Die Form mit zwei Argumenten ist eine Ergänzung zur Form mit einem Argument, daher ist das Ziel immer das erste Argument.quelle
ln
.-t
), fühlt sich dann fast wie ein Beweis an.ln
msgstr " erstellt den Link im aktuellen Verzeichnis. Die Form mit zwei Argumenten ist eine Ergänzung zur Form mit einem Argument und daher ist das Ziel immer das erste Argument." Da es Sinn macht, dass dies der Fall ist, wenn ich über die zweite Form nachdenke, denke ich, dass dies mir helfen wird, mich zu erinnern.Ich gehe vorbei "
ln
ist wiecp
. Die" Quelle "muss zuerst kommen."quelle
mv
.mv
,cp
Undln
alle nehmen eine vorhandene Datei als erstes Argument, und das beabsichtigte Ziel Datei- oder Verzeichnisnamen als zweites Argument.memcpy
,strcpy
usw. um die andere Art und Weise arbeiten.memcpy(dest,src,n);
sehr gut zu Mapsdest = src;
. Mit anderen Worten, setze (die erstenn
Bytes von) dest gleich (die erstenn
Bytes von) src.Die meisten Unices dokumentieren den
ln
Befehl als(Ich lasse hier Optionen usw. weg)
Beispiele:
Der POSIX-Standard
OpenBSD :
NetBSD und FreeBSD
Mac OS
Solaris
AIX
Das GNU-
ln
Handbuch nennt dassource
Ziel und dentarget
Linknamen .GNU Handbuch für
ln
Das Ignorieren der GNU Wortwahl, die
ln
folgt Dienstprogramm , um die gleiche Art von Semantik wie zBmv
undcp
dass in dem Ziel ist das, was aus der erzeugt wird Quelle .Deshalb,
würde den symbolischen Link erstellen, auf den
b
verwiesen wirda
.Beachten Sie auch, dass beim Erstellen von symbolischen Links die Quelle lediglich eine Zeichenfolge ist, auf die der symbolische Link zeigen soll. Es wird normalerweise keine Überprüfung durchgeführt, um zu bestätigen, dass es auf etwas Nützliches hinweist:
quelle
ln -s a b
, und das hat nichts mit der GNU-Formulierung zu tun, da ich glaube, dass ich mir die Formulierung in der Manpage noch nie angeschaut habe. : D (Es ist einfacher, einfach zu laufen,ln -si a b
wenn Sie nicht sicher sind, es wird sich beschweren, wenn esb
bereits existiert.)Für den Fall, dass dies jemandem hilft: Ich habe mich daran gewöhnt, es als "ln what where " zu betrachten, was mir hilft, mich daran zu erinnern, dass das erste Argument ("what") die vorhandene Datei ist, das zweite ("where") der Ort es verlinken. Im Gegensatz zu den Überlegungen in den meisten anderen Antworten ist dies nichts anderes als ein markiger Satz, den ich mir mental vortragen kann, wenn ich einen Befehl eingebe, der als Erinnerungshilfe dient. Dies wird wahrscheinlich nicht für alle von Nutzen sein, aber ich vermute, dass es einigen Menschen helfen wird.
Es hilft, dass die anderen Standardbefehle zur Dateibearbeitung dieselbe Konvention verwenden, sodass ich das Gleiche für
cp
und tun kannmv
.quelle
Ich habe kürzlich eine großartige Möglichkeit gehört, mich an diese besondere Sache zu erinnern: einen Reim
Der erste Vers ist das, was die Argumente von ln sind: etwas Altes, gefolgt von einem Namen des neuen Verzeichniseintrags.
quelle
Ab 1971 Unix First Edition-Handbücher .
Es gibt eine zweite , einfache Syntaxform.
edit: Ich habe FILE oder die Dateinamen anstelle von TARGET --- siehe Kommentare usw. siehe auch sehr lange hinaus an der Unterseite, die Adressierung Eisberg, hart und weich von
ln
, nicht nur die Spitze davon.Also hat GNU folgendes
ln
:wo du den Linknamen nicht brauchst. Nachdem
ln -s /usr/lib/modules
Sie eine bekommenmit dem gleichen Namen wie FILENAME ("Ziel" oder "Quelle"), genau dort, wo Sie sind. Keine Wahl, keine Verwirrung.
Wenn Sie anspruchsvoller sind und den Link unter einem anderen Namen und / oder an einem anderen Ort erstellen möchten , fügen Sie diesen Wunsch als Namen oder Pfad hinzu. Das eigentliche Ziel steht an erster Stelle, der neue Linkname an zweiter Stelle.
Oder Sie sagen: "Ich kenne diese Pfeilnotation
ls -l
für Links. Ich habe keinen Pfeil in der Shell, der die Richtung meines Links anzeigt. Also muss ich ihn umdrehen."Sie erstellen es in die eine Richtung, damit Sie es in der anderen verwenden können.
(ENDE DES ANTWORTEN-DER-FRAGE-TEILS)
Auf einer anderen Ebene hat das Wort "Verbindung" selbst eine tief verborgene doppelte Bedeutung. Symbolische Links kamen später, so dass ein Link in den Anfängen nur ein Link war. Es gab keine weichen und harten, keine
-s
Option. Und jetzt verwende ich sogar die Quell-Ziel-Symbolik:Zu diesem Zeitpunkt gibt es Verknüpfungen, aber keine harten und weichen, und
ls -l
es werden keine Pfeile angezeigt, da es in einer (harten) Verknüpfung keine Richtung gibt. Eine "Verknüpfung" in dieser Phase der Unix-Entwicklung bedeutete, dass der Dateiname "B" (Verzeichniseintrag "B") im Dateisystem auf denselben Inode verweist, auf den der Dateiname "A" verweist.Die Dateien A und B sind miteinander "verknüpft", da sie dieselben Blöcke verwenden. Nun muss der Kernel bei jedem rm überprüfen: Lösche / befreie ich die Blöcke dieser Datei auf der Festplatte oder gibt es eine andere Datei, die mit denselben Blöcken verknüpft ist? Dafür wird ein Linkzähler verwendet.
Angenommen, Sie möchten eine große Datei auf / tmp grom behalten, die gelöscht werden soll, und tun dies
ln /tmp/bigfile
. Jetzt haben Sie eine große Bigfile in Ihrem Arbeitsverzeichnis. Nachdem Sie / tmp gesäubert und das "Original" entfernt haben, können Sie weiterhin dieselben Datenblöcke verwenden. Sie bekommen keinen toten oder baumelnden Link, Sie haben eine normale Datei. Der Verweis auf keine Datei, sondern nur das Dateisystem blockiert, wie es jeder Verzeichniseintrag tut. Erst jetzt ist "cleaning" / tmp nicht mehr so effektiv wie es war. Es sieht leer aus und ist es auch, aber die Blöcke auf der Partition werden nicht freigegeben.Auch wenn eine harte Verbindung nicht wie cp indirekt Speicherplatz kostet, kann sie dies.
Hinzufügen
ln -s
zu der obigen Sequenz:Jetzt hat "B", der Softlink, nur eine Zeichenfolge mit einem Pfadnamen. Das ist "soft" info. Technisch gesehen sind "A" und "B" nicht miteinander verbunden. Dennoch ist B ein "Link" in dem neuen Sinne, dass Sie diesen gespeicherten Pfadnamen als Verknüpfung zu "A" verwenden können. Jetzt ist es "eine Verknüpfung zu A" (Punkt) und nicht "verknüpft mit der Inode von Datei A".
Beide Arten von Links können nicht nur Menschen verwirren, sondern auch den Kernel / fs. In der Manpage von 1971 heißt es: "BUGS: Links werden zweimal gesichert und als separate Dateien mit separaten Inodes wiederhergestellt."
Harte Links zu Verzeichnissen (selten / nicht erlaubt) können leicht zu einem Verstopfen führen.
Softlinks zu Verzeichnissen (sehr häufig) können zu ewigen Schleifen führen - müssen von Utilities / Kernel erkannt werden.
Praktisches Beispiel in Bash
Beginnend mit einer regulären Datei "F" ...
... macht Fhard genauso groß wie F, aber beide erscheinen jetzt in einem dunklen Rot OHNE Pfeile
ls -l --color
. Wegen derstat
Anzeige von "Links: 2" in Verbindung mit "Inode: xyz". Feste Verknüpfung F macht F selbst zu einer festen Verknüpfung. Beide sind / stay Dateityp "reguläre Datei". Beide haben jedoch eine Inode mit einer Linkanzahl über 1.... erstellt eine winzige "unregelmäßige" Datei "Fsoft" mit dem Dateityp "symbolischer Link" - noch platzsparender als ein leeres Verzeichnis. A
ls -l
zeigt nichts spezielles für "F". Für Fsoft beträgt die angezeigte Größe 1 Byte, da die Zeichenfolge 'F' ist undFsoft -> F
als Name angezeigt wird. Es ist nicht erforderlich, einen Softlink einzufärben, um einen zu erkennen. Weil in der Kurzformls -F
eine aufgerollte Kette@
angehängt wird:Fsoft@
Damit
ls -l
sieht es so aus:Fhard hat Fs Größe und Typ.
Fsoft hat den Namen von F und die Länge von F als Größe und einen anderen Dateityp.
Kurz
ls -sF
:das Hinzufügen
--block-size=1
ergibt auch nicht die gleichen Größen. Fsoft hat die Größe "ein Byte, null Blöcke". F und Fhard weichen parallel ab:Um zu sehen, ob Fsoft baumelt oder nicht,
ls
können Sie Farben verwenden.quelle
Es ist sehr hilfreich, sich daran zu erinnern, dass der Name des Links optional ist. Wenn es nicht angegeben wird, wird der Basisname des Verbindungsziels verwendet.
ist identisch mit dem vollständigen Löschen des Linknamens:
Dies würde keinen Sinn ergeben, wenn das Linkziel zuletzt genannt würde.
quelle
Denken Sie nur an Unix -> AT & T -> Ziel auf der rechten Seite:
quelle
ln abc def
,abc
unddef
dasselbe Objekt sind; sie sind nicht zu unterscheiden. Darüber hinaus hat der Vorgang keine Auswirkung aufabc
die Anzahl der Verbindungen. Das Ziel istdef
. Ein Zeiger auf das Objekt wird amdef
Speicherort neu installiert .ln -s abc def
bedeutet dies, dass der Inhaltabc
in location geschrieben wirddef
.abc
muss nicht einmal etwas auflösen; es kann eine baumelnde Verbindung sein.mv dest src
,ln [ -s ] dest src
,cp dest src
, ...Persönlich bevorzuge ich es, mich nicht an X zu erinnern , um zu wissen, wo ich nach X suchen soll, wenn ich es brauche. Ich bin auch ein Fan der "Better Safe than Sorry" -Einstellung, daher schaue ich immer gerne genau nach, was ich schreibe, insbesondere als Root.
In diesem Fall steht die Antwort buchstäblich in den ersten Zeilen der Manpage:
Ich hätte es nicht vorgeschlagen, wenn es erforderlich wäre, in der Manpage nachzulesen, aber da es direkt am Anfang ist, lohnt es sich meiner Meinung nach die 3 Sekunden, die es braucht, um zu tippen
man ln
und zu beenden.quelle
Ähnlich wie bei cp, das ich mental als „kopiere dies nach dem anderen“ las, las ich in Befehlen als „verbinde dies nach dem anderen“.
quelle
So erinnere ich mich daran: Vergiss das Ziel. Mit anderen Worten, wenn ich in dir1 bin und hier einen Symlink zu file1 erstellen möchte, der in / some / other / dir / vorhanden ist, würde ich einfach Folgendes tun:
In dir1 wird ein Symlink mit dem Namen file1 angezeigt, der auf / some / other / dir / file1 verweist. Aus der Manpage für ln:
Beachten Sie jedoch, dass dies nur funktioniert, wenn der Symlink denselben Namen wie das Ziel haben soll (was höchstwahrscheinlich der Fall ist).
quelle
Ich würde gerne die Antwort von @ gary erläutern.
Zusätzlich zu seiner Antwort: Der
ln
Befehl kann eine beliebige Anzahl von Argumenten akzeptieren, so dass Sie mehrere Symlinks in einem Aufruf erstellen können (was praktisch ist, wenn Sie es benötigen).ln -s foo bar baz
, was ist die logischste Erklärung, welche Argumente bedeuten was?ln -s foo bar
Was ist bei der Antwort auf # 1 die logischste Erklärung, welche Argumente bedeuten was?quelle
Stellen Sie sich eine Version vor, mit
ln
der Sie mehrere (symbolische) Links in einem Befehl erstellen können.Es würde keinen Sinn machen, dies umzukehren, da ein Symlink immer nur auf einen Punkt
TARGET
gleichzeitig zeigen kann und die normale Befehlszeilen-Konvention darin besteht, den sich wiederholenden Teil am Ende der Befehlszeile einzufügen, zgrep PAT [FILE]...
quelle
"
ls
zeigta -> b
soln a b
"Denken Sie daran, dass dies falsch ist.
quelle
ls -l
:link -> target
kann Ihre Vorstellung von der Einrichtung derln
Befehlszeile verwirren . Aber ich habe Angst, dass es nicht viel hilft.