cd .. nella cartella principale


44

Perché cd .., digitato nella cartella principale, non avvisa o fallisce con un errore?

Mi aspetterei:

/$ cd ..
-bash: cd: ..: No such file or directory

Invece, sono lasciato a /. Ovviamente, questo esiste poiché ..esiste /ed è semplicemente /come .. Mi chiedo solo perché sia ​​così.


6
Nessuna risposta, ma ecco una buona lettura associata, Rob Pike su G + che discute l'origine dei file dot.
bsd

Risposte:


53

Secondo l'Open Group (responsabile dello standard POSIX):

Ogni directory ha esattamente una directory principale che è rappresentata dal nome punto-punto nella prima directory. [...] Ciò a cui il nome punto dot-dot si riferisce alla directory principale è definito dall'implementazione. Nella versione 7 si riferisce alla directory principale stessa; questo è il comportamento menzionato in POSIX.1-2008. In alcuni sistemi in rete la costruzione /../hostname/ viene utilizzata per fare riferimento alla directory principale di un altro host e POSIX.1 consente questo comportamento.

(Fonte)


29

Non si ottiene un errore perché anche la /directory ha effettivamente una voce di directory valida per .., ma a differenza di altre directory punta alla directory stessa e si comporta quindi identica a .:

$ ls -lid / /. /..
128 drwxr-xr-x 22 root root 4096 Apr 15 11:26 /
128 drwxr-xr-x 22 root root 4096 Apr 15 11:26 /.
128 drwxr-xr-x 22 root root 4096 Apr 15 11:26 /..
$

Come la prima colonna indica, ., .., e /tutti hanno lo stesso inode numero e quindi sono le stesse voci del filesystem.

Quindi anche se cd ..dentro di /te rimani /.


13
La domanda chiede perché la ..voce della directory è lì.
Nick Matteo,

3
L'unica ragione che mi viene in mente è che vuoi trattare /come qualsiasi altra cartella, inclusa una voce valida per ... Altrimenti dovresti trattare in modo /diverso rispetto a tutte le altre cartelle nel sistema.
Dohn Joe,

15

È lì perché rimuoverlo richiederebbe la creazione di codice di gestione di casi speciali nel kernel e nelle librerie C. In questo momento puoi presumere che ci sarà sempre un '.' e '..' in qualsiasi directory in cui vai.

L'unico codice caso speciale richiesto in questo momento è nel codice di montaggio del filesystem, in cui il codice sovrascrive il valore di inode di '..' per puntare alla directory contenente il punto di montaggio, poiché le directory root non sono sempre directory root.


Dopotutto, è impossibile che il "riferimento-genitore" nelle strutture ad albero sia libero da qualsiasi gestione di casi speciali, non è vero? La radice deve essere speciale per definizione e ogni tentativo di mascherare che porterà a casi speciali o confusione altrove.
musiphil,

@musiphil In unix i casi speciali qui vengono rimescolati al mountcomando e al file speciale associato /etc/fstab.
Luser droog

1

Un altro modo per controllare ciò .e ..in /realtà è:

$ readlink -f ..
/home

$ readlink -f /.
/

$ readlink -f /..
/

Come si può vedere, .ed ..è indicato /.


1

Un altro motivo per cui ".." è in / è che se non fosse presente creerebbe un altro caso speciale: la directory root avrebbe un hard link in meno di tutte le altre directory (tutti i nodi della directory hanno n + 2 link, dove n è il numero di sottodirectory dirette all'interno). Ciò interromperebbe vari programmi che si basano sull'ottimizzazione delle scansioni di directory.


0

È bello che sia lì, perché altrimenti non sarei in grado di spam ../../../../per arrivare alla radice da una cartella. Se non lo consentisse ..alla radice, sarei bloccato a contare il numero di cartelle nella directory di lavoro.


10
Cosa c'è che non va cd /?
Bach,

@Bach A volte, il mashing della tastiera è più divertente. Inoltre, in molte circostanze non stai cercando di andare alla radice, nel qual caso usare ../è meglio. Faccio anche molte operazioni sui file in PHP, dove non posso farlo /per diversi motivi.
Skylar Ittner il

2
Il rovescio della medaglia è che forse si inseriscono accidentalmente troppi se si ../opera (o si rimuove) un file che non si intendeva fare senza errori.
jamesdlin,

4
Ripetermi ../più volte del necessario e desiderare che funzioni come previsto mi sembra un errore logico (dormiente), anche se apparentemente il filesystem lo consente.
musiphil

@musiphil digitando spazi tra i comandi - è un errore logico (si supponga che tutti gli spazi tra tail -f | grep siano un must). La maggior parte delle persone unix ne soffrono. Digitare '../ ..' sembra un problema di Windows (per impostazione predefinita, cmd inizia in X: \ Windows e devi fare spam .. dall'inizio). Perché curare un piccolo problema quando ce n'è uno più grande? (spazi)
kagali-san,
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.