Consejos para recordar el orden de los parámetros para ln?

64

Solía lnescribir enlaces simbólicos durante años, pero todavía obtengo el orden de los parámetros al revés.

Esto generalmente me tiene escribiendo:

ln -s a b

y luego mirando la salida para recordarme.

Siempre imagino ser a -> bcomo lo leo cuando en realidad es lo contrario b -> a. Esto se siente contrario a la intuición, así que descubro que siempre me estoy cuestionando.

¿Alguien tiene algún consejo para ayudarme a recordar el orden correcto?

Zhro
fuente
11
a veces es útil decirlo en voz alta cuando lo escribes en "enlace simbólico ay lo llamas b"
jsotola
2
Crea el segundo parámetro al igual que con cp, y crea el enlace. Pero si lo hace de la manera incorrecta, no se preocupe, porque no puede sobrescribir un archivo existente o un enlace simbólico con un nuevo enlace.
sudodus
1
Relacionado: Dirección de un enlace simbólico
G-Man dice 'Reinstate Monica' el
1
Piense en ello como un "alias de tipo malo". Siempre se lo menciona primero por su nombre real, luego por sus alias. Ej: Tony Baloney, alias Oscar Meyer. O en el caso de su enlace, ln -sab significa "Archivo-a también se conoce como Archivo-b".
Scottie H
1
ln source target. Igual que cp source target, mv source target; ...
user207421

Respuestas:

40

Utilizo lo siguiente: lntiene una forma de un argumento (segunda forma listada en la página de manual ) en la que solo se requiere el objetivo (porque cómo podría lnfuncionar sin conocer el objetivo) y lncrea el enlace en el directorio actual. La forma de dos argumentos es una adición a la forma de un argumento, por lo tanto, el objetivo es siempre el primer argumento.

Gary
fuente
3
Tenga en cuenta que el formulario sin ruta de destino / destino es una extensión de la especificación POSIX de ln.
Kusalananda
1
@kusa: ¿viste el manual de 1971 en mi respuesta con el formulario de un argumento? ¿Cómo puede ser una extensión de posix si estuvo allí en 1971? --- "Si se da
@ SP No estoy seguro de entender lo que quieres decir. ¿Está diciendo que una implementación histórica de alguna manera supera el estándar POSIX actual?
Kusalananda
1
Yo tambien veo. Diferentes nombres, mismos argumentos, al menos. No tenía idea de que GNU es el único con estos nombres arg.
2
Hubo muchas buenas respuestas aquí (especialmente la rima de @loa_in_) pero voy a ir con esta. Afirmar que el orden de los parámetros es consistente (ignorar -t), entonces se siente casi como una prueba. " lncrea el enlace en el directorio actual. La forma de dos argumentos es una adición a la forma de un argumento y, por lo tanto, el objetivo es siempre el primer argumento". Debido a que tiene sentido que este sea el caso al considerar la segunda forma, creo que esto me ayudará a recordar.
Zhro
85

Voy por " lnes como cp. La 'fuente' debe ser lo primero".

Hermann
fuente
20
... y como mv. mv, cpy lntodos toman un archivo existente como primer argumento y el archivo de destino previsto o el nombre del directorio como segundo argumento.
Hans-Martin Mosner
77
Es una pena que memcpy, strcpyetc. funcionen al revés.
Arkadiusz Drabczyk
66
@ Hans-MartinMosner, excepto que cuando crea un enlace simbólico, no tiene que ser un archivo existente ...
ilkkachu
1
@ilkkachu Tienes razón. Ninguna regla sin excepción :-)
Hans-Martin Mosner
1
@ArkadiuszDrabczyk Por otro lado, algo así como memcpy(dest,src,n);mapas muy bien dest = src;. En otras palabras, establezca (los primeros nbytes de) dest igual a (los primeros nbytes de) src.
un CVn
10

La mayoría de los Unices documentan el lncomando como

ln source target

(Estoy omitiendo opciones, etc., aquí)

Ejemplos:

  • El estándar POSIX

    ln [-fs] [-L|-P] source_file target_file
    
  • OpenBSD :

    ln [-fhLnPs] source [target]
    
  • NetBSD y FreeBSD

    ln [-L | -P | -s [-F]] [-f | -iw] [-hnv] source_file [target_file]
    
  • Mac OS

    ln [-Ffhinsv] source_file [target_file]
    
  • Solaris

    /usr/bin/ln [-fns] source_file [target]
    
  • AIX

    ln [ -f | -n ] [ -s ] SourceFile [ TargetFile ]
    

El lnmanual de GNU llama al source objetivo y al target nombre del enlace .

Ignorando la elección de palabras de GNU, la lnutilidad sigue el mismo tipo de semántica que, por ejemplo, mvy cpen que el objetivo es lo que se crea a partir de la fuente .

Por lo tanto,

ln -s a b

crearía el enlace simbólico que bapunta a a.

Tenga en cuenta también que al crear enlaces simbólicos , la fuente es simplemente una cadena que representa a lo que debe apuntar el enlace simbólico. Por lo general, no se realiza ninguna verificación para validar que apunta a algo útil:

$ ln -s "hello world" README.txt
$ ls -l
total 0
lrwxr-xr-x  1 kk  wheel  11 Sep 15 11:39 README.txt -> hello world
Kusalananda
fuente
55
Culpo completamente a la documentación de GNU por el hecho de que la gente se equivoca en absoluto. Su redacción es comprensible en retrospectiva pero objetivamente confusa.
Konrad Rudolph
66
@KonradRudolph, por el contrario, la redacción de GNU me parece acertada. La utilidad crea un enlace con algún nombre, apuntando a algún lugar. "Nombre del enlace" es un poco obvio, y "objetivo" es un perfectamente buena descripción de algo que apunta a . Como anécdota, todavía tengo que pensar a veces de qué manera ln -s a bfunciona, y eso no tiene nada que ver con la redacción de GNU, ya que no creo que haya visto nunca la fraseología en la página del manual. : D (Es más fácil correr ln -si a bcuando no estoy seguro, se quejará si bya existe).
ilkkachu
1
@KonradRudolph, aunque técnicamente, llamarlo "objetivo" en el caso de un enlace duro es incorrecto , ya que no es el nombre existente sino el inodo el objetivo real. Me pregunto si la gente de GNU pensó que un usuario común no debería tener que pensar en eso con tanto detalle.
ilkkachu
Es interesante señalar, como se menciona en los comentarios de la respuesta de @ gary, que el objetivo no es opcional en el estándar POSIX.
Zhro
@kusa: con "ln -s AB --- copia solo el nombre del archivo a B". He adoptado tu interpretación en un contexto ligeramente cambiado. Incluso puedo estar de acuerdo con su ejemplo radical de "hola mundo". "Solo el nombre del archivo 'ES una cadena. Solo quiero
7

En caso de que esto ayude a alguien: me he acostumbrado a pensar que es "en qué dónde ", lo que me ayuda a recordar que el primer argumento ("qué") es el archivo existente, el segundo ("dónde") es el lugar ponerle (un enlace). A diferencia del razonamiento en la mayoría de las otras respuestas, esto no es más que una frase concisa que puedo recitar mentalmente mientras escribo un comando, que sirve como ayuda para la memoria. Esto probablemente no será útil para todos, pero sospecho que ayudará a algunas personas.

Ayuda que los otros comandos estándar de manipulación de archivos usen la misma convención, por lo que puedo hacer lo mismo para cpy mv.

David Z
fuente
44
Tengo curiosidad por tener una idea de por qué esto fue rechazado. No hay mucho aquí que pueda estar mal: ¿mezclé el pedido o algo así?
David Z
Personalmente, creo que "en qué dónde" todavía no es inequívoco sin la explicación: ¿qué podría ser "a qué apunta el enlace?" (correcto) o "¿qué se vincula a algo?" (incorrecto). Lo mismo con where: "¿hacia dónde apunta el enlace?" (incorrecto) o "dónde se debe crear el enlace" (correcto). Por lo tanto, esto no necesariamente ayuda mucho si te estás cuestionando a ti mismo. Sin embargo, recordar cp y mv debería ayudar.
125_m_125
Todos esperamos que un comando UNIX incluya sus argumentos de archivo después de otros tipos de argumentos (como grep, por ejemplo). Crea un archivo de cierto tipo con un contenido dado. Que el sistema de archivos haga algo especial y que usualmente coloquemos la ruta a algún archivo fuente es incidental para ln. Por ejemplo, podría escribir un editor de texto que almacenara el contenido de su primera línea en un enlace simbólico llamado 1, etc. Esto sería una tontería, pero enfatiza que ln crea algún tipo de archivo con algunos contenidos de texto, nada más ni menos, y hace que el argumento parezca lógico.
Dannie
@ 125_m_125 La interpretación alternativa que presentó no tiene mucho sentido para mí, pero está bien; Esta ayuda de memoria no es para todos.
David Z
6

Recientemente escuché una excelente manera de recordar esta cosa en particular: una rima

Algo viejo, algo nuevo

algo prestado, algo azul

y seis peniques en su zapato.

El primer verso es cuáles son los argumentos de ln: algo antiguo seguido de un nombre de la nueva entrada del directorio.

loa_in_
fuente
3
NAME    ln -- make a link
SYNOPSIS    ln name1[ name2 ]
DESCRIPTION ln creates a link to an existing file name1. 
            If name2 is given, the link has that name; 

Desde 1971 Unix Primera edición Manuales .

Hay una segunda forma de sintaxis simple.


Edit: Me poner el archivo o nombre de archivo en lugar de TARGET --- ver comentarios, etc. véase también muy largo Además en la parte inferior, dirigiéndose al iceberg, duro y blando de ln, no sólo la punta de la misma.


Entonces GNU lntiene esto:

ln [opt] FILENAME

In the 2nd form, create a link to FILENAME in the current directory.

donde no necesita el nombre del enlace. Después de ln -s /usr/lib/modulesobtener un

modules -> /usr/lib/modules

con el mismo nombre que FILENAME ("target" o "source"), justo donde estás. No hay elección, no hay confusión.

Ahora, si es más exigente y desea que el enlace se cree con otro nombre y / o en otro lugar , agregue ese deseo como nombre o ruta. El objetivo real es lo primero, el nombre del nuevo enlace de fantasía adicional segundo.


O usted dice: "Conozco esta notación de flecha ls -lpara enlaces. No tengo una flecha en el caparazón para mostrar la dirección de mi enlace. Así que tengo que darle la vuelta".

Lo crea en una dirección, por lo que puede usarlo en la otra.

(FIN DE LA PARTE DE RESPUESTA-PREGUNTA)


En otro nivel, la palabra "enlace" en sí lleva un doble significado oculto. Los enlaces simbólicos llegaron más tarde, por lo que en los primeros días un enlace era solo un enlace. No había -sopciones suaves y duras, no . Y ahora incluso uso el simbolismo fuente-destino:

mv    A B   --- move the whole file to B (dir or new name)
cp    A B   --- copy whole file (mv and cp are "the same" here)    
ln    A B   --- copy whole file MINUS data blocks (=copy only inode and name), and increase "link count" for track keeping

En esta etapa, hay enlaces, pero no duros y blandos, y ls -lno muestra flechas, porque no hay dirección en un enlace (duro). Un "enlace" en esa etapa de evolución de Unix significaba que el nombre de archivo "B" (entrada de directorio "B") en el sistema de archivos apunta al mismo inodo al que apunta el nombre de archivo "A".

Los archivos A y B están "vinculados" juntos, porque comparten los mismos bloques. Entonces, ahora con cada rm, el kernel tiene que verificar: ¿elimino / libero los bloques de este archivo en el disco, o hay otro archivo vinculado a los mismos bloques? Para eso, se utiliza un contador de enlaces.

Supongamos que desea mantener un archivo grande en / tmp grom siendo eliminado y hacerlo ln /tmp/bigfile. Ahora tiene un gran archivo grande en su directorio de trabajo. Después de limpiar / tmp y remover el "original", felizmente seguirás usando los mismos bloques de datos. No obtienes un enlace muerto o colgante, tienes un archivo normal. Apuntando a ningún archivo pero solo bloques del sistema de archivos como lo hace cada entrada de directorio. Solo que ahora "limpieza" / tmp no es tan eficaz como lo era. Parece vacío, y lo es, pero los bloques en la partición no se liberan.

A pesar de que un enlace rígido no cuesta espacio en sí mismo como lo hace cp, indirectamente puede hacerlo.

Agregando ln -sa la secuencia anterior:

ln -s A B   --- copy only the file's name to "B"   

Ahora "B", el enlace suave, solo tiene una cadena con un nombre de ruta. Esta es información "blanda". Técnicamente "A" y "B" no están relacionados. Pero aún así B es un "enlace" en el nuevo sentido de que puede usar ese nombre de ruta almacenado como acceso directo a "A". Ahora es "un enlace a A" (punto) y no "vinculado con el inodo del archivo A"

Ambos tipos de enlaces pueden confundir no solo a los humanos sino también al kernel / fs. La página del manual de 1971 señala: "ERRORES: los enlaces se copian dos veces y se restauran como archivos separados con inodos separados".

Los enlaces duros a directorios (poco frecuentes / no permitidos) pueden provocar fácilmente una obstrucción.

Los enlaces blandos a directorios (muy comunes) pueden conducir a bucles eternos, deben ser reconocidos por utilities / kernel.

Ejemplo práctico en bash

Comenzando con un archivo regular "F" ...

ln F Fhard

... hace que Fhard tenga el mismo tamaño que F, pero AMBOS aparecen ahora en rojo oscuro SIN flechas ls -l --color. Por statmostrar "Enlaces: 2" en relación con "Inode: xyz". El enlace duro F convierte a F en un enlace duro. Ambos son / stay filetype "archivo normal". Pero ambos tienen un inodo con un recuento de enlaces superior a 1.

   ln -s F Fsoft

... crea un pequeño archivo "irregular" "Fsoft" con el tipo de archivo "enlace simbólico" --- incluso más ahorro de espacio que un directorio vacío. A ls -lno muestra nada especial para "F". Para Fsoft, el tamaño que se muestra es de 1 byte ya que la cadena es 'F' y Fsoft -> Fse muestra como nombre. No es necesario colorear un enlace suave para reconocer uno. Porque en la forma abreviada ls -Fse @ agrega una cadena en espiral :Fsoft@

Con ls -lesto se ve así:

-rw-r--r-- 2 root root 6070340 Sep 16 16:28 F
-rw-r--r-- 2 root root 6070340 Sep 16 16:28 Fhard
lrwxrwxrwx 1 root root       1 Sep 16 16:31 Fsoft -> F

Fhard tiene el tamaño y el tipo de F.

Fsoft tiene el nombre de F y la longitud del nombre de F como tamaño, y un tipo de archivo diferente.

Corto ls -sF:

5932 F    5932 Fhard     0 Fsoft@

agregar --block-size=1no produce los mismos tamaños tampoco. Fsoft tiene el tamaño "un byte, cero bloques". F y Fhard se desvían en paralelo:

6074368 F  6074368 Fhard    0 Fsoft@

Para ver si Fsoft cuelga o no, le lspermite usar colores.

ORPHAN 40;31;01 # symlink to nonexistent file, or non-stat'able file

fuente
2

Es realmente útil recordar que el nombre del enlace es opcional. Si no se proporciona, se utiliza el nombre base del destino del enlace.

ln -s /path/to/file1 file1

es idéntico a soltar el nombre del enlace por completo:

ln -s /path/to/file1

Esto no tendría ningún sentido si el objetivo del enlace fuera mencionado en último lugar.

rexkogitans
fuente
1

Solo piense en Unix -> AT&T -> destino a la derecha:

mov %eax, %ebx  ;; AT&T style assembler syntax: %ebx register gets value of %ecx

mv foo bar    ;; foo renamed to bar

cp foo bar    ;; contents of foo go to bar

foo | bar     ;; data moves left to right in pipeline

ln abc def    ;; link to abc installed as def
Kaz
fuente
"cp foo bar" significa "bar". "ln abc def" significa "abc". Si hubiera guardado los símbolos: "to foo". Ese es exactamente el problema.
@ user370539 Eso no es verdad; después ln abc def, abcy defson el mismo objeto; son indistinguibles Además, la operación no tiene ningún efecto abc, aparte de aumentar su recuento de enlaces. El destino es def. Se acaba de instalar un puntero al objeto en la defubicación.
Kaz
@ user370539 Si el enlace es simbólico, ln -s abc defsignifica que el contenido abcestá escrito en la ubicación def. abcni siquiera tiene que resolver nada; Puede ser un enlace colgante.
Kaz
Tu comentario es exactamente ... incorrecto. Debería ser de otra manera.
rexkogitans
@rexkogitans Mi punto es que es consistente. Si la orden es "malo" y debe ser revertida, entonces debería ser para todos aquellos comandos: mv dest src, ln [ -s ] dest src, cp dest src, ...
Kaz
0

Personalmente, prefiero evitar recordar X, a favor de saber dónde buscar X cuando lo necesito. También soy fanático de la actitud de "más vale prevenir que curar", por lo que siempre me gusta revisar cuidadosamente lo que estoy escribiendo, especialmente como root.

En este caso, la respuesta está literalmente en las primeras líneas de la página de manual:

   ln [OPTION]... [-T] TARGET LINK_NAME
   (...)
   In the 1st form, create a link to TARGET with the name LINK_NAME.

No lo habría sugerido si fuera necesario profundizar en la página de manual, pero como está justo al principio, en mi humilde opinión, vale la pena los 3 segundos que lleva escribir man lny salir.

dr01
fuente
-1

Similar a cp, que leí mentalmente como "copiar esto a eso", leí los comandos ln como "vincular esto a eso".

jl6
fuente
2
Esto es muy similar a la respuesta mejor calificada .
Michael
Entonces, "ln -s AB 'vincula A con B? ¿Es ahora A -> B o B -> A? Creo que la mayoría ni siquiera ha pasado la primera etapa de confusión. Dicen que es simple, pero simplemente está mal.
-2

Así es como lo recuerdo: Olvídate del objetivo. En otras palabras, si estoy en dir1 y quiero crear un enlace simbólico aquí al archivo1 que existe en / some / other / dir /, simplemente haría:

ln -s /some/other/dir/file1

Obtendrá un enlace simbólico llamado file1 en dir1 que apunta a / some / other / dir / file1. Desde la página de manual de ln:

En [OPCIÓN] ... OBJETIVO (segundo formulario) ... En el segundo formulario, cree un enlace a OBJETIVO en el directorio actual.

Solo tenga en cuenta que esto funciona solo si desea que el enlace simbólico tenga el mismo nombre que el objetivo (lo que probablemente sea el caso).

Saltando conejito
fuente
¿Alguien puede explicar por qué esto fue rechazado? Acabo de copiar y pegar desde la página de manual (y en consecuencia atribuido) Ayudará a otros a entender cómo publicar en SE. Gracias.
Saltando Bunny
Puedo explicar: es un choque cultural. No te preocupes Verifique las otras respuestas, comentarios ...
-3

Me gustaría ampliar la respuesta de @ gary.

Además de su respuesta: el lncomando puede aceptar un número arbitrario de argumentos, por lo que puede crear múltiples enlaces simbólicos en una sola invocación (lo cual es útil cuando lo necesita).

  1. Con ese conocimiento, cuando te encuentras ln -s foo bar baz, ¿cuál es la explicación más lógica de qué argumentos significa qué?
  2. Con la respuesta al # 1, cuando te encuentras ln -s foo bar, ¿cuál es la explicación más lógica de qué argumentos significa qué?
yegle
fuente
1
Si tiene una adición a la respuesta de Gary, sugiérala como una edición. Tal como está, sus dos preguntas finales (¿hipotéticas?) Hacen que esta "Respuesta" se parezca más a una segunda pregunta.
Jeff Schaller
-3

Imagine una versión de la lncual le permitió crear múltiples enlaces (simbólicos) en un solo comando.

Synopsis: ln -s TARGET NEW_LINK...
Example: ln -s target_file  new_link_1  new_link_2  new_link_3

No haría nada para revertir eso, ya que un enlace simbólico solo puede apuntar a uno TARGETa la vez y la convención de línea de comando normal es colocar la parte que se repite al final de la línea de comando, por ejemplogrep PAT [FILE]...

jrw32982 es compatible con Monica
fuente
-6

" lsMuestra a -> bde manera ln a b"

Solo recuerda que esto está mal.

Oh Dios mío
fuente
66
Siempre recuerdo "algo, algo siempre está mal". ¿Pero qué camino está mal? Ese es el problema. El problema se convierte en mi segunda duda, incluso cuando lo hago bien. ¡Porque no puedo recordar el orden correcto!
Zhro
Creo que entiendo lo que quieres decir: el resultado de ls -l: link -> targetpuede confundir tu idea de cómo configurar la lnlínea de comando. Pero me temo que no ayudará mucho.
sudodus