Quale directory rappresenta il percorso `//` in Linux?


13

Quando voglio tornare alla directory di livello superiore in Linux digitando cd .., ho scritto a macchina cd //. Con mia grande sorpresa, non vengono segnalati errori. Inoltre, il prompt diventa username@hostname://$. lsindica che ora sono nella directory principale.

È un bug o una caratteristica della shell? Se una funzione, è //un alias di /? La mia shell è GNU bash, versione 4.1.5 (1) -release (i686-linux-gnu).

Grazie e distinti saluti.


Risposte:


30

Può essere considerato neanche.

In Linux, //non significa nulla: più barre consecutive vengono ridotte a una, ovunque nel percorso, incluso l'inizio. Cambiare directory per //metterti in /, come readlink /proc/self/cwddirebbe in esecuzione ; allo stesso modo, /usr//local///binè crollato a /usr/local/bin.

Tuttavia, alcuni altri sistemi simili a Unix, ad esempio Cygwin o il vecchio dominio / sistema operativo Apollo, utilizzano il // prefisso per percorsi di rete come //fileserver/path/to/data. POSIX consente anche questo.

Per vari motivi, la shell bash tiene traccia autonomamente della directory corrente (oltre al tracciamento fornito dal sistema operativo) e contiene del codice che impedisce al //collasso iniziale di rimanere compatibile con tali sistemi. La "caratteristica" è che bash fornisce un tracciamento più intuitivo della directory corrente, ad esempio, quando si trova cdin un collegamento simbolico, bash ti mostrerà il percorso che ti aspetti, anche se il kernel la pensa diversamente. Il "bug" è che bash lo consente //anche su sistemi che non lo usano.


È interessante notare che zshconsente cd //, ma è abbastanza intelligente da mostrare solo /nella stringa di prompt.
nuovo123456

@BinaryZebra Bitsavers ha una raccolta di vecchi manuali Unix, tra cui quelli di Apollo - ci dovrebbero essere molti esempi lì. Anche il sito Web TUHS dovrebbe avere qualcosa.
user1686

Molte grazie, ho trovato la descrizione di // nel manuale di Bitsavers.

9

Dalla definizione del percorso POSIX:

Un percorso può eventualmente contenere una o più barre finali. Molte barre successive sono considerate uguali a una barra.

fonte

E più precisamente come la gravità menzionata nel suo commento qui sotto, dal capitolo 4.11 sulla risoluzione del nome percorso:

Un nome di percorso che inizia con due barre successive può essere interpretato in modo definito dall'implementazione, anche se più di due barre iniziali devono essere trattate come una barra singola.


1
Una sezione più adeguata è 4.11 Pathname Resolution (ultimo paragrafo), dal momento che il comportamento in questione appare solo per i due principali barre.
user1686,

3

È una specie di caratteristica. Se hai lo script di shell attivo e utilizzabile find, ad esempio tutti i percorsi hanno il prefisso ./ di solito. Quindi, se lo attacchi su un percorso effettivo, diventa `/my/path/./appended/path, che si risolve in / my / path / appended / path. Quindi, se non sbaglio, // get viene interpretato come /./ e quindi /. Questo è lo stesso per se andassi in / home / user //, finiresti in / home / user /


1

Vorrei richiedere la visualizzazione di "bug".

Entrambi i percorsi "/", "//", "//////////////////////", ... hanno lo stesso significato: "/". Puoi aggiungere quanti "/" dove vuoi in un percorso Unix, questo non ne modifica il significato.

Il "bug" è più qui correlato al fatto che il tuo prompt utilizza l'ultimo percorso digitato valido per la visualizzazione, non l'attuale "pwd".

Divertente comunque;)


D'accordo - il //prompt nel è un effetto collaterale della variabile d'ambiente del prompt ( $PS1) - come viene PS1definito?
Doug Harris,

@DougHarris la $PS1variabile è definita come [\u@\h \W]\$. Qualche problema con l'impostazione?
Summer_More_More_Tea

Dispari. Se provo quella PS1, ne ottengo una solo /quando pwd = /. Mi chiedevo se stavi facendo un lavoro extra per ottenere la directory. È $PROMPT_COMMANDimpostato?
Doug Harris,

@DougHarris Sì, questa variabile è impostata, il cui valore è echo -ne "\033]0;${USER}@${HOSTNAME%%.*}:${PWD/#HOME/~}"; echo -ne "\007". Potresti spiegarci un po 'in dettaglio? Non ho abbastanza familiarità con queste due variabili. Grazie.
Summer_More_More_Tea

Leggi la pagina man di bash e cerca PS1e PROMPT_COMMAND- usa man bashdalla tua riga di comando o leggi online
Doug Harris,

1

È una caratteristica e tutti i // multipli verranno sostituiti in un singolo /

È utile se alla fine sono presenti variabili con percorsi come nell'esempio. Quindi il tuo cd non otterrà alcun errore e non dovrai cambiare la variabile dell'area di lavoro.

MY_WORKSPACE = / home / nome_utente / lavoro /
MY_NEW_PROJECT = $ MY_WORKSPACE / my_proj /
cd $ MY_NEW_PROJECT 

il contenuto completo della variabile di progetto è

/ Home / nome_utente / area di lavoro // my_proj /

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.