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.