Regole di sintassi del percorso


10

Sto scrivendo una libreria per manipolare stringhe di percorso Unix. Stando così le cose, ho bisogno di capire alcuni angoli oscuri della sintassi di cui la maggior parte delle persone non si preoccuperebbe.

Ad esempio, per quanto posso dire, sembra che foo/bared foo//barentrambi puntino allo stesso posto.

Inoltre, di ~solito sta per home directory dell'utente, ma cosa succede se appare nel mezzo di un percorso? Cosa succede allora?

Queste e molte altre decine di domande oscure devono rispondere se scriverò un codice che gestisce correttamente ogni possibile caso. Qualcuno sa di un riferimento definitivo che spiega le regole esatte della sintassi per questa roba?

(Sfortunatamente, la ricerca di termini come "Sintassi del percorso Unix" fa apparire solo un milione di pagine che parlano della $PATHvariabile ... Cavolo, sto persino lottando per trovare tag adatti a questa domanda!)


ok ~ tilde e l'espansione -filename sono alla base delle caratteristiche POSIX definite di qualsiasi ambiente Unix. Alcuni consigli: un nome file può essere tutt'altro che \ 0 o /. ////// e / sono la stessa cosa. $ PWD è gestito nel kernel e può essere letto per qualsiasi processo (Linux) in / proc. /./ può verificarsi solo nella radice di un percorso. In $ PATH ::::: e: sono la stessa cosa. / dev / null / dev / tty e / tmp sono percorsi garantiti POSIX per ogni sistema conforme.
Mikeserv,

1
La maggior parte della tua domanda (ma non la parte relativa ~) è trattata in Come linux gestisce separatori di percorsi multipli (/ home //// nome utente /// file) . La cosa più vicina a un riferimento normativo sarebbe la specifica POSIX o Single Unix - non facile lettura.
Gilles 'SO- smetti di essere malvagio' il

Risposte:


13

Esistono tre tipi di percorsi:

  • percorsi relativi gradiscono foo, foo/bar, ../a, .. Non iniziano con /e sono relativi alla directory corrente del processo che effettua una chiamata di sistema con quel percorso.
  • percorsi assoluti come /, /foo/baro ///x. Iniziano con 1 o 3 o più /, non sono relativi, vengono cercati a partire dalla /directory principale.
  • POSIX consente //foodi essere trattato in modo speciale, ma non specifica come. Alcuni sistemi lo usano per casi speciali come i file di rete . Deve essere esattamente 2 barre.

Oltre all'inizio, le sequenze di barre si comportano come una.

~è speciale solo per la shell , è espanso dalla shell, non è affatto speciale per il sistema. Il modo in cui viene espanso dipende dalla shell. Le conchiglie eseguono altre forme di espansione come globbing ( *.txt) o espansione variabile /$foo/$baro altre. Per quanto riguarda il sistema ~fooè solo un percorso relativo come _fooo foo.

Cose da tenere a mente:

  • foo/non è lo stesso di foo. È più vicino foo/.di foo(soprattutto se fooè un collegamento simbolico) per la maggior parte delle chiamate di sistema sulla maggior parte dei sistemi ( foo//è lo stesso di foo/se).
  • a/b/../cnon è necessariamente uguale a a/c(ad esempio se a/bè un collegamento simbolico). La cosa migliore non è trattare in modo ..speciale.
  • è generalmente sicuro considerare a/././././blo stesso come a/bse.

Quindi, in sintesi, se non mi importa di shell manipolazione percorso (che è vasto e complicato), ho solo bisogno di preoccuparsi /, .e ..(?)
MathematicalOrchid

Un esempio di //foogestione è in Cygwin, dove viene utilizzato per i percorsi UNC . Cioè, //server/share/dir/file.txtè un percorso legale che punta fuori dal sistema per impostazione predefinita. Cygwin ricade sul sistema locale se non riesce a trovarlo server.
Warren Young,

3

Ad esempio, per quanto posso dire, sembra che foo / bar e foo // bar puntino entrambi nello stesso posto.

Sì. Questo è comune perché a volte il software concatena un percorso presumendo che la prima parte non sia stata terminata con una barra, quindi ne viene lanciata una per accertarsene (il che significa che potrebbe finire per essere due o più). foo///bare foo/////barindicano anche lo stesso posto di foo/bar. Una bella funzione per una libreria di manipolazione dei percorsi sarebbe quella che riduce a uno qualsiasi il numero di barre sequenziali (tranne all'inizio di un percorso, dove può essere utilizzato in modo URL-ish o, come sottolinea Stephane, per qualsiasi scopo speciale non specificato).

Inoltre, ~ di solito sta per home directory dell'utente

Tale trasformazione viene eseguita tramite la shell e la tilde exapansion , che funzionano solo se è il primo carattere del percorso. La necessità o meno di affrontarlo dipende dal contesto. Se la libreria deve essere utilizzata con programmi normali che ricevono, ad esempio, argomenti della riga di comando contenenti un percorso, l'espansione tilde viene già eseguita quando vedono il percorso. L'unica situazione che vedo preoccupante è se stai elaborando percorsi direttamente da un file di testo.

Oltre a ciò, ~è un personaggio legale in un percorso * nix e non dovrebbe essere cambiato in nient'altro. Come per questo , i soli caratteri che non sono legali in un nome di file Unix sono /(perché è il separatore di percorso) e "nullo" (alias. Un byte zero) perché sono illegali nel testo generale.


+1 per la spiegazione dell'espansione della tilde; Non avevo idea che potresti far riferimento ad altri utenti con esso!
MathematicalOrchid

2
Come dice Stephane, non puoi comprimere ciecamente tutte le ripetute barre in avanti. Le barre multiple in avanti all'inizio del percorso devono essere trattate con cura.
Warren Young,

@WarrenYoung Modificato per chiarire questo punto. PS. Inoltrare??! O_O
goldilocks

Meglio, anche se non direi che ciò abbia a che fare con gli URL. L'UNC risale alla fine degli anni '80, mentre gli URL non apparivano fino a anni dopo.
Warren Young,

@WarrenYoung Abbastanza giusto, anche se sembrerebbe che gli UNC siano specifici per le piattaforme MS , quindi //tecnicamente non lo è neanche. Sia l'URL sia la più recente, secondo SC specifica liberamente ambigua per POS // potrebbero essere state derivate da tale, nel qual caso "URL-ish" sembra un'etichetta adatta per la convenzione (anche se gli UNC sono più vecchi, e anche se l'apparenza è involontario). Non direi mai che "sono URL", solo quello //o ha \\ uno scopo "URL-ish".
Riccioli d'oro,
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.