Dovrei includere una barra finale / in un collegamento simbolico a una directory?


30

Il collegamento simbolico a una directory dà risultati diversi a ls -lseconda che io ln -s diro ln -s dir/. Ma qual è la differenza reale e quale dovrei preferire perché?

Risposte:


9

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 tarTabSpacelinkcompletata ln -s target/ link.


La domanda collegata sembra riguardare più barre successive nei percorsi, ma non le barre finali sui collegamenti. Non sono sicuro che abbia qualcosa da dire qui.
mwfearnley,

In realtà, non avrei dovuto dirlo. C'è molto da dire, su una preoccupazione comune che è strettamente correlata alla domanda. Non penso che porti fino a questa conclusione però.
mwfearnley,

@mwfearnley È una conseguenza logica: se 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ì.
Gilles 'SO- smetti di essere malvagio' il

Ciao, grazie per aver risposto .. Mi dice che i percorsi inclusi i link simbolici sono equivalenti. Non mi dice necessariamente cosa succede se accedo al link simbolico stesso (senza una barra finale) e senza essere un esperto Unix, non so necessariamente cosa significhi o non significhi "equivalenza".
mwfearnley,

C'è almeno un caso limite in cui fa la differenza, quindi ho dovuto sottovalutare questa risposta.
Flimm,

27

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.


3

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.


Mi chiedo anche se in realtà fa la differenza, ma perché allora quella barra aggiuntiva dovrebbe essere memorizzata?
Tobias Kienzler,

2

La tua domanda riguarda davvero il comportamento del lsprogramma.

1) Se fai ls -l $dirdove $ dir è in realtà un collegamento simbolico, ottieni informazioni sul collegamento simbolico.

2) Se fai ls -lL $dirdove $ 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 lsutilizzata. 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.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.