Perché la directory principale è contrassegnata da un segno /?


95

Ho fatto alcune ricerche su questo su Google, ma i risultati sono stati torbidi. Perché il /segno viene utilizzato per indicare la directory principale. Ci sono solide ragioni dietro?


12
Il motivo è che '/' è il separatore di directory e mentre la directory radice stessa è senza nome, così come cd /homeequivale ad cd /home/aggiungere /alla fine del nome vuoto fornisce l'accesso a quella directory.
SF.


11
È senza nome, perché se visto dall'interno, è il limite dell'albero di directory visibile. La gerarchia di directory visibile potrebbe essere semplicemente una sottostruttura in una gerarchia più ampia, ad esempio quando le ricerche di percorsi sono state modificate tramite una chroot()chiamata, ma se visualizzate dall'interno, vengono sottratte.
Thomas Nyman,

14
Perché la stringa vuota sarebbe stata una scelta orribile!
Bakuriu,

3
Oltre a quanto menzionato, l'uso di / per indicare la radice dà alcuni effetti collaterali in termini di nomi di percorso assoluti e relativi. /some/dirSEMPRE significa (root)/some/dirmentre some/dirè sempre relativo alla directory di lavoro corrente. Questo principio è anche trasferibile all'uso dell'URL web.
Tor Valamo,

Risposte:


108

La barra in avanti /è il carattere delimitante che separa le directory in percorsi in sistemi operativi simili a Unix. Questo personaggio sembra essere stato scelto negli anni '70 e, secondo fonti aneddotiche , le ragioni potrebbero essere legate al fatto che il predecessore di Unix, il sistema operativo Multics , usasse il >personaggio come separatore di percorsi, ma i progettisti di Unix avevano già prenotato i caratteri >e <per indicare il reindirizzamento I / O sulla riga di comando della shell ben prima che avessero un file system multilivello. Quindi, quando è arrivato il momento di progettare il filesystem, hanno dovuto trovare un altro personaggio per indicare la separazione degli elementi del nome percorso.

Una cosa da notare qui è che nel terminale ADM-3A di Lear-Siegler di uso comune durante gli anni '70, da cui tra l'altro ha origine la pratica di utilizzare il ~carattere per rappresentare la directory home , la /chiave è accanto alla >chiave:

disposizione della tastiera del terminale Lear-Siegler ADM-3A

Per quanto riguarda il motivo per cui la directory root è indicata da un singolo /, è una convenzione molto probabilmente influenzata dal fatto che la directory root è la directory di livello superiore della gerarchia di directory e mentre altre directory possono trovarsi al di sotto di essa, di solito non c'è ' t un motivo per fare riferimento a qualsiasi cosa al di fuori della directory principale. Allo stesso modo la voce della directory stessa non ha nome, perché è il limite dell'albero della directory visibile.


2
"mentre altre directory possono trovarsi al di sotto, di solito non c'è motivo di fare riferimento a qualcosa al di fuori della directory principale." Non lo capisco Non sono sicuro di quale direzione intendi per "sotto", ma non c'è nulla "al di fuori" della gerarchia montata /. I filesystem Unix sono un singolo albero, con punti di montaggio per le varie unità.
alexis,

4
C'è anche chroote così - non puoi accedere a nulla al di fuori della nuova radice, ma ciò non significa che non ci siano.
Bobson,

1
@Gilles, la posizione fisica dell'unità non è la domanda. Qualsiasi partizione del disco è al di fuori della partizione root in quel senso, ma è montata sotto root nella gerarchia del filesystem. Bobson, buon punto su chroot, ma non si adatta a ciò che Thomas ha detto: dopo chroot non è che "di solito non c'è un motivo" per uscire dalla radice del sistema; è impossibile. Su Unix, tutto nel filesystem è root.
alexis,

1
"Dopo chroot non è che" di solito non c'è un motivo "per uscire dalla radice del sistema; è impossibile". Questo è chiaramente sbagliato. Al momento è chroot()stato introdotto, non aveva alcuna proprietà simile a una prigione , ma si limitava a influenzare la risoluzione del percorso. Ancora oggi, i processi privilegiati possono uscire da un chroot in base alla progettazione . Ho anche menzionato chroot()in un commento precedente .
Thomas Nyman,

4
IIRC, la convenzione Multics utilizzata non solo >come separatore di directory, ma anche <per fare riferimento alla directory principale: <da sola era equivalente a .., mentre <fooera equivalente a ../foo. L'ho sempre trovato esteticamente piacevole.
Mark Reed,

55

Il primo file system gerarchico come lo conosciamo oggi è stato progettato per Multics . Il progetto è descritto in "Un file system per scopi secondari per l'archiviazione secondaria" di RC Daley e PG Neumann. Una caratteristica saliente di questo filesystem è che una directory è un file che può essere contenuto in una directory come qualsiasi altro file. La struttura del file forma un albero, in cui tutti i nodi non foglia sono directory. La radice dell'albero è sempre una directory. Ogni file ha un nome (il nome della voce ) che è unico nella sua directory principale. La directory principale non ha un nome poiché non è contenuta in un'altra directory.

Per designare un file, è necessario descrivere il percorso dalla radice dell'albero. Multics ha adottato una sintassi naturale per i nomi dei percorsi in cui se Pè il percorso di una directory ed Fè il nome di un file, allora è la sintassi per il file chiamato all'interno della directory il cui percorso è .P>FFP

Per quei momenti in cui non vuoi caricarti di directory, Multics aveva un'idea di directory di lavoro . Un nome di file nudo senza indicazione di directory viene interpretato come un file nella directory di lavoro.

Combinando queste regole, fooè un file nella directory di lavoro; foo>barè un file nella directory figlio della directory foodi lavoro e così via. Queste regole descrivono percorsi relativi, ma è necessaria una regola supplementare per creare percorsi assoluti a partire dalla directory principale. Dato che la lettura di un nome di percorso da sinistra a destra corrisponde allo spostamento dalla radice alle foglie dell'albero, la radice dovrebbe essere indicata da un marcatore speciale a sinistra del nome del percorso. Dato che i nomi dei file non sono mai vuoti (perché ciò sarebbe spesso fonte di confusione), nessun nome di percorso relativo inizia mai con il carattere >, il che lo rende un indicatore conveniente per nomi di percorso assoluti. Quindi >fooè il file chiamato foonella directory principale, >foo>barè il file chiamato barnella directory chiamatafoonella directory principale e così via. Questo lascia la directory principale, che potrebbe essere la stringa vuota; tuttavia, spesso non è conveniente usare la stringa vuota come nome percorso, quindi viene scritta >, il che ha l'ulteriore vantaggio che un nome percorso è assoluto se e solo se lo è il suo primo carattere >.

Unix ha adottato questo progetto da Multics. Poiché Unix aveva già utilizzato il personaggio >per il reindirizzamento dell'output nella sua shell dei comandi, i suoi progettisti hanno scelto un carattere diverso /per separare le directory nei nomi dei percorsi.


11

Nei componenti del nome del percorso su Unix, non possono essere utilizzati solo due caratteri: il carattere null, che termina le stringhe in C (il linguaggio del kernel) e la barra, che è riservata come separatore del percorso. Inoltre, i componenti del percorso non possono essere stringhe vuote.

Quindi, nel nome di un percorso, abbiamo solo due tipi di token: una barra e un componente.

Supponiamo che, senza aggiungere nuovi token , vorremmo supportare due tipi di percorsi, relativi e assoluti. Inoltre, vorremmo essere in grado di fare riferimento alla directory principale, che non ha un nome (non ha un genitore che gli darebbe un nome).

Come possiamo rappresentare percorsi relativi, percorsi assoluti e fare riferimento alla directory principale, usando solo la barra?

Il modo più ovvio per estendere una lingua (oltre all'introduzione di un nuovo token) è quello di creare una nuova sintassi: dare un nuovo significato alle combinazioni di token che sono sintassi non valide.

I percorsi che iniziano con una barra non hanno senso, quindi perché non utilizzare una barra iniziale come marcatore che indica "questo percorso è assoluto, piuttosto che relativo".

Un percorso che non contiene altro che una barra non è valido, quindi perché non assegnargli il significato di "directory principale".

Questi due significati si uniscono perché un percorso assoluto inizia la ricerca nella directory principale. In altre parole, una barra iniziale può essere considerata come avente il significato:

  • passare alla directory principale e utilizzare il carattere barra.
  • se c'è più materiale nel percorso, elaboralo come percorso relativo, altrimenti hai finito.

Quindi, potremmo anche lanciare una barra rovesciata, che può significare "questo percorso afferma che l'ultimo componente del percorso è il nome di una directory anziché un file normale o qualsiasi altro tipo di oggetto: quella barra finale indica quella directory in modo simile a il modo in cui la barra iniziale indica la directory principale. "

Con tutto questo sopra la sintassi, abbiamo ancora sintassi con un significato non assegnato: doppie barre, triple barre e così via.

Perché non introdurre un altro token e farlo in modo diverso. Ciò è probabilmente dovuto al fatto che i progettisti hanno adottato approcci minimalisti in generale. (Perché l' ededitor visualizza un solo ?quando si fa qualcosa di sbagliato?) La barra è facile da digitare, non richiede spostamento. Un linguaggio di percorso con solo due tipi di token (componente e barra) è facile da ricordare e da usare.

Un'altra considerazione importante è che è possibile manipolare facilmente i percorsi usando solo rappresentazioni di stringhe. Ad esempio, possiamo "re-root" percorsi assoluti verso una nuova directory padre abbastanza facilmente:

OLD_PATH=/old/path
NEW_HOME=/new/home

NEW_PATH="$NEW_HOME$OLD_PATH"  /new/home/old/path

Questo non funzionerebbe se avessimo indicato percorsi assoluti in qualche altro modo, come un segno di dollaro o qualsiasi altra cosa:

OLD_PATH=^old/path  # ^ means absolute path
NEW_HOME=^new/home

# now we need more string kung-fu than just catenation
NEW_PATH="$NEW_HOME/${OLD_PATH#^}"

Questo tipo di codifica è ancora necessario in alcuni casi quando si ha a che fare con percorsi in stile Unix, ma ce n'è meno.


8
"La barra è facile da digitare, non richiede spostamento." Forse scendi facilmente lì attraverso il laghetto, ma qui in Finlandia non dobbiamo solo premere il tasto MAIUSC, ma anche raggiungere tutta la fila dei numeri . ; P
Thomas Nyman,

1
@ThomasNyman Comunque sia, i layout di tastiera straniera non erano probabilmente una preoccupazione per Ken Thompson. La barra era facile da digitare per gli sviluppatori Unix e i loro primi utenti.
Kaz

1
Giusto. Sebbene stavo scherzando principalmente, trovo interessante (e occasionalmente divertente) come alcune peculiarità nel software con una lunga tradizione possano essere spiegate da peculiarità nell'hardware contemporaneo .
Thomas Nyman,

@ThomasNyman Haha, mi chiedo se Bill Joy stesso acceda e aggiorni le parti {citazione necessaria} in quella pagina ADM-3A, un po 'di "Wikidickhead" quindi contrasterà con: "questo articolo contiene ricerche originali". :)
Kaz

@ThomasNyman, ora credo che ci siano tastiere "a pedale" per cui puoi digitare /usando il piede destro. Proprio come suonare un pianoforte.
Pacerier,
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.