Il collegamento simbolico a una directory dà risultati diversi a ls -l
seconda che io ln -s dir
o ln -s dir/
. Ma qual è la differenza reale e quale dovrei preferire perché?
Il collegamento simbolico a una directory dà risultati diversi a ls -l
seconda che io ln -s dir
o ln -s dir/
. Ma qual è la differenza reale e quale dovrei preferire perché?
Risposte:
Non c'è alcuna differenza. (Ci sarebbe una differenza se la destinazione non fosse una directory esistente.)
La barra finale potrebbe essere finita lì a causa del completamento della shell: con qualche configurazione, viene ln -s tar
TabSpacelink
completata ln -s target/ link
.
foo -> bar/
allora foo/qux
è equivalente a bar//qux
. Sebbene il titolo della domanda, formalmente parlando, non includa foo -> bar/
, discuto anche quel caso nella mia risposta lì.
L'unica cosa che mi viene in mente è che ti "protegge" da qualcuno che cancella la directory e crea un file.
[user@host linktest]$ mkdir test
[user@host linktest]$ ln -s test/ slash
[user@host linktest]$ ln -s test noslash
[user@host linktest]$ ls -l
total 4
lrwxrwxrwx 1 paul paul 4 Feb 21 21:00 noslash -> test
lrwxrwxrwx 1 paul paul 5 Feb 21 21:00 slash -> test/
drwxrwxr-x 2 paul paul 4096 Feb 21 20:59 test
[user@host linktest]$ file *slash
noslash: symbolic link to `test'
slash: symbolic link to `test/'
[user@host linktest]$ rmdir test
[user@host linktest]$ file *slash
noslash: broken symbolic link to `test'
slash: broken symbolic link to `test/'
[user@host linktest]$ touch test
[user@host linktest]$ file *slash
noslash: symbolic link to `test'
slash: broken symbolic link to `test/'
[user@host linktest]$
La versione con la barra si interrompe quando la destinazione viene sostituita con un file.
Domanda interessante. Ho fatto un piccolo test:
$ mkdir dir
$ ln -s dir/ test_slash
$ ln -s dir test_noslash
$ ls -l
total 4
drwxr-xr-x 2 vrusinov vrusinov 4096 Feb 21 16:41 dir
lrwxrwxrwx 1 vrusinov vrusinov 3 Feb 21 16:41 test_noslash -> dir
lrwxrwxrwx 1 vrusinov vrusinov 4 Feb 21 16:41 test_slash -> dir/
$ strace ls test_slash 2> trace_slash
$ strace ls test_noslash 2> trace_noslash
$ wc -l trace_*
79 trace_noslash
79 trace_slash
$ diff -u trace_* | less
Come puoi vedere, non c'è differenza nel numero di chiamate di sistema (almeno per ls) e le tracce sembrano molto simili. Tuttavia, questo è solo un dump test e non sono sicuro - potrebbero esserci delle differenze.
La tua domanda riguarda davvero il comportamento del ls
programma.
1) Se fai ls -l $dir
dove $ dir è in realtà un collegamento simbolico, ottieni informazioni sul collegamento simbolico.
2) Se fai ls -lL $dir
dove $ dir è un link simbolico a una directory, ottieni informazioni sulla directory di destinazione.
3) Se lo fai ls -l $dir/.
impone il symlink da seguire e fornisce informazioni sulla directory di destinazione.
4) In tal caso ls -l $dir/
, i risultati potrebbero essere gli stessi del n. 1 o potrebbero essere gli stessi del n. 3 a seconda della versione ls
utilizzata. Ero abituato a una versione precedente di Solaris come # 1 e sono rimasto sorpreso da Linux come # 3.
e quale dovrei preferire perché?
Senza barra finale se si può essere preoccupati se un nome di directory è una directory effettiva rispetto a un collegamento simbolico a una directory.
Con la barra finale se sei più preoccupato per i file nella directory anziché nella directory stessa.