`~ / Documents` è un percorso relativo o assoluto?


37

Questa è solo una domanda sul vocabolario, ma che continua a girarmi nella mia testa.

Viene da un esame di pratica da un libro di preparazione LPIC . La risposta corretta secondo il libro è che ~/Documentsè una directory relativa perché è relativa alla directory home.

Tuttavia, questo libro contiene un rapporto onorevole di errori di battitura ed errori, quindi non posso dare per scontato tutto ciò che è scritto lì. Qui non sono d'accordo perché per me ~agisce come una variabile espansa dalla shell nel contenuto della $HOMEvariabile o nel percorso della directory home dell'utente corrente (cfr. man bash), Quindi il percorso effettivo è /home/myuser/Documentsche è davvero una directory assoluta.

Anche Wikipedia , per una volta, non mi sembra di aiuto su questo argomento (anche se sembra confermare che il libro è sbagliato su questo):

Un percorso assoluto o completo punta alla stessa posizione in un file system indipendentemente dalla directory di lavoro corrente. Per fare ciò, deve contenere la directory principale.

Al contrario, un percorso relativo inizia da una determinata directory di lavoro, evitando la necessità di fornire il percorso assoluto completo.

Anche in questo caso, non sono d'accordo: secondo questa definizione, il percorso /opt/kde3/bin/../libche non dipende dalla directory di lavoro corrente dovrebbe essere assoluto, tuttavia la mia attuale comprensione di questo corrisponde all'autore del libro rendendo questo percorso relativo.

Una rapida ricerca sul web sta solo aggiungendo alla mia frustrazione, secondo Webster Dictionary :

percorso assoluto - Un percorso relativo alla directory principale. Il suo primo carattere deve essere il separatore del percorso.

Quindi $HOME/Documents, o anche solo $HOMEnon verrebbero considerati directory assolute? O questa definizione implica un'espansione variabile? E il ~personaggio della shell ? Esiste una definizione affidabile di directory relativa o assoluta che posso trovare da qualche parte e mi sbaglio completamente?


7
Tutti i percorsi sono relativi, alcuni sono relativi solo alla directory principale /e quelli che chiamiamo assoluti. Così tutto quello che parte da /che chiamerei assoluta (anche se questo è /usr/../etc) e tutto il resto mi chiamerebbero relativa ( ~/Doc, Doc, ../john/Doc, $HOME/..., ...). Il punto è che l'assoluto dovrebbe funzionare indipendentemente dalla directory di lavoro corrente o dall'utente corrente. Il parente può funzionare solo in alcuni casi specifici specifici.
jimmij,

6
Il percorso potrebbe espandersi in una posizione diversa a seconda di chi sia l'utente. Detto questo, questo è ancora un percorso assoluto, non un percorso relativo, secondo me. Anche se non penso che le definizioni di percorso assoluto e relativo siano definite in modo così preciso. Questa non è matematica. Questa domanda non mette davvero alla prova la comprensione, l'imo ed è inutile.
Faheem Mitha,

1
@FaheemMitha: LPIC è una certificazione Linux neutrale nella distribuzione. La certificazione stessa sembra buona, ma questo è lungi dall'essere il caso di (almeno alcuni) libri venduti per preparare questo esame come studio autonomo ...
WhiteWinterWolf

2
@jimmij: "parente" ha significati tecnici specifici nel contesto dei percorsi e l'uso di un diverso senso della parola in inglese è una cattiva pratica. Sono totalmente in disaccordo con la chiamata di ~/fooun percorso relativo. Quello che stai ottenendo è la differenza tra hard-coding e parametrizzazione. Vedi la mia risposta per maggiori dettagli.
Peter Cordes,

1
Le definizioni del dizionario Webster sono corrette, ma molto confuse. Tuttavia, implica che stringhe come ~/Documentse $HOME/Documentsnon sono percorsi. Identificano percorsi (assoluti) dopo l'espansione, ma non sono percorsi stessi. Penso che sia d'accordo con quanti utenti Unix / Linux usano il termine, ma senza dubbio quelle stringhe sono anche chiamate percorsi stessi.
reinierpost,

Risposte:


41

Se l'autore stava provando a catturarti parlando di quella stringa letterale (senza espansione della shell) come percorso, allora è un percorso relativo ( mkdir -p './~/Documents'). Altrimenti:


È un percorso assoluto , perché risolverlo non dipende dalla directory di lavoro corrente del processo. Il percorso relativo significa sempre relativo alla directory di lavoro del processo. O nel caso di target di link simbolici, relativamente alla posizione del link simbolico. ( gcc -> gcc-5.2vs. gcc -> /usr/bin/gcc-5.2). Questo è importante per i montaggi NFS e altri casi in cui è possibile accedere allo stesso collegamento simbolico tramite percorsi assoluti diversi. per esempio

/net/tesla/home/peter/foo -> bar  # always works from other machines

/net/tesla/home/peter/foo -> /home/peter/bar  # references my home dir on the local machine, not tesla.

Debian a volte installa collegamenti simbolici ../../doc/whatever/whatever, anziché un target assoluto di collegamenti simbolici, quindi funziona quando NFS è montato da qualche altra parte, o quando guarda un chroot senza chroot(8)inglobarlo.

Ogni processo Unix ha il suo CWD. Il pwdcomando esiste solo per stamparlo.

consultare: http://pubs.opengroup.org/onlinepubs/9699919799/functions/getcwd.html per ulteriori informazioni sulla modifica delle directory con le chiamate di sistema POSIX.


Come altri hanno già detto, ~viene espanso dalla shell prima che il percorso venga utilizzato per qualsiasi cosa. L'uso ~/bin/myprogin uno script di shell lo farà funzionare in modo diverso per utenti diversi. La differenza tra ~/bin/fooe /home/peter/bin/fooè che uno di essi ha codificato a fondo la posizione, mentre l'altro l'ha parametrizzata. È un errore (IMO) chiamare la ~versione un percorso relativo.

Parlare di cose "relative a una variabile d'ambiente" è confuso. È una cattiva pratica usare diversi significati in lingua inglese di termini che hanno significati tecnici specifici nel contesto in cui li stai usando.

Su un sistema rotto, con HOME=a/relative/path, ~/foosi espanderebbe in un percorso relativo. Questa non sarebbe affatto una configurazione utilizzabile.


3
Grazie per questa risposta, mi sembra la più completa. Ho anche l'impressione che l'autore abbia erroneamente confuso la nozione di percorso canonico in questo (che l'autore non menziona da nessuna parte). /opt/kde3/bin/../libper esempio è erroneamente classificato come un percorso relativo: è un percorso assoluto ma non quello canonico. Come hai detto, questo rende tutto confuso, quindi grazie per il chiarimento e le informazioni relative a NFS :)!
WhiteWinterWolf

1
Devo concludere che scrivere un libro di preparazione ai test non è molto divertente e che le persone che usano semplicemente Unix o GNU / Linux per il loro calcolo quotidiano non sono quelle che scrivono quei libri. Quell'esempio di chiamare un parente non canonico è davvero brutto e ovvio per me. man7.org/linux/man-pages/man3/realpath.3.html (e realpath(1)) fanno entrambe le cose: canonicalizzano e rendono assoluti (oltre a seguire i collegamenti simbolici), quindi probabilmente si è creata una certa confusione.
Peter Cordes,

2
Tuttavia, quelli sono solo normali concetti quotidiani per me. Penso che sarebbe strano avere un pezzo di carta che dicesse di conoscerli ... Ma buona fortuna avere il tuo pezzo di carta, @ WhiteWinterWolf, da mostrare a tutte le persone che amano guardare pezzi di carta. :)
Peter Cordes,

48

Questa è essenzialmente una domanda sulla definizione dei termini. Quindi, per i tuoi scopi, la risposta è qualunque cosa LPIC voglia. Ma possiamo arrivare ad alcune conclusioni basate su fatti tecnici:

Se si è passati '~/Documents'a una chiamata di sistema , cercherebbe una directory chiamata esattamente ~nella directory corrente (e probabilmente fallirà). Quindi, con la nozione di nomi di percorso usati dal kernel , questo è un percorso relativo - ma non è quello che intendevamo.

~è la sintassi implementata dalla shell (e da altri programmi che la imitano per comodità) che la espande in un vero percorso. Per illustrare, ~/Documentsè approssimativamente la stessa cosa di $HOME/Documents(di nuovo, sintassi della shell). Poiché $HOMEdovrebbe essere un percorso assoluto, anche il valore di $HOME/Documents è un percorso assoluto. Ma il testo $HOME/Documentso ~/Documentsdeve essere espanso dalla shell per diventare il percorso che intendiamo.

Quindi, se volessi essere preciso e coerente, direi che ~/Documentsè un frammento di shell-script che si espande in un percorso assoluto.


Naturalmente, il kernel non avrebbe idea di cosa $HOMEsignifichi, proprio come non ha idea di cosa ~significhi. Trovo tuttavia che l'affermazione secondo cui ~ l'espansione è fatta dalla shell sia dubbia; la maggior parte delle applicazioni lo supporta, che punta verso la libreria C anziché verso la shell. L'espansione delle variabili d'ambiente è tuttavia una caratteristica della shell; puoi aprire ~/somefile.odtin LibreOffice, ma non $HOME/somefile.odt, anche se LibreOffice è stato avviato da una shell all'interno della quale $ HOME è correttamente impostato.
un CVn

5
Puoi trovarlo dubbioso tutto quello che vuoi, ma è documentato e dovrebbe essere facile da confermare o confutare in C.
Inutile

6
Altri programmi implementano la ~sintassi nell'imitazione della shell, perché è un collegamento utile. In realtà non so se esiste una funzione di libreria che esegue l'espansione, ma è sicuramente qualcosa che viene fatto separatamente dall'uso effettivo del nome percorso.
Kevin Reid,

2
globe wordexpfare l'espansione della tilde tra le altre cose.
o11c,

2
@ MichaelKjörling: alcuni programmi implementano l' ~espansione; la maggior parte no. Ad esempio, se si digita ls -l ~, il lsprogramma non vede mai il ~carattere; viene espanso dalla shell prima che lsvenga invocato. Se passi effettivamente un ~a ls, non lo tratterà in modo speciale; prova ls -l '~'' (che proverà ad elencare un file chiamato letteralmente ~).
Keith Thompson,

16

Se il tuo $HOMEè /home/white/, ~/Documents(uguale a $HOME/Documents) viene espanso dalla shell (vedi qui per una spiegazione) a /home/white/Documents, che è un percorso assoluto .

Un percorso relativo è uno che non inizia con un /(dopo l'espansione della shell), come ../Documentsofoo/bar

Alcuni vecchi gusci non si espandono ~(il modo in cui bash, tcsh, zsh, ecc ... fare); vedrebbero ~/Documentscome un percorso relativo che inizia con ~; ma di solito non hai un nome di directory come ~(ma potresti crearne uno con mkdir '~'cui non consiglio).


dovresti menzionare quali conchiglie non si espandono~
Edward Torvalds,

3

Un percorso assoluto inizia da /(ciò a cui fa riferimento è fisso), un percorso relativo inizia dalla directory corrente (e quindi ciò a cui si riferisce cambia quando cambia la directory corrente). La maggior parte delle shell utilizza ~all'inizio come abbreviazione del percorso assoluto della home directory dell'utente corrente, ovvero ~/Documentsè la directory Documentsnella home dell'utente corrente, indipendentemente da quale sia la directory corrente. Quindi è un percorso assoluto.


1

Il percorso potrebbe espandersi in una posizione diversa a seconda di chi sia l'utente. Detto questo, questo è ancora un percorso assoluto, non un percorso relativo, secondo me. Tuttavia, non penso che le definizioni di percorso assoluto e relativo siano definite in modo così preciso. Questa non è matematica. Questa domanda non mette davvero alla prova la comprensione, secondo me, ed è inutile.


La definizione è molto più che opinione. Wikipedia lo prende per il caso generale, non solo per Unix: en.wikipedia.org/wiki/…
Peter Cordes,

1

L'uso di ~ / all'inizio rende il percorso assoluto poiché (per qualsiasi definizione) riuscire a trovare documenti non dipende da dove ci si trova attualmente. Comunque l'espansione è fatta dalla shell, non dal kernel, quindi se stai usando una shell che non riconosce questa sintassi (come / bin / sh, la shell Bourne originale, non l'alias bash), sarai fuori fortuna.

È interessante notare che se usi ~ root / piuttosto che ~ /, l'ottimizzazione della lettura $ HOME in genere non si applica e si risolverà sempre in un assoluto se / etc / passwd è corretto.


-1

Il libro sembra considerare che un percorso assoluto è qualsiasi percorso che inizia con un /, e un percorso relativo è qualcos'altro.

Potresti visualizzare ..e $HOMEcome tipi simili di token. Entrambi devono essere sostituiti, per un componente del percorso, prima che il percorso si risolva in un percorso assoluto.


3
Com'è ..qualcosa $HOME? ..può essere all'inizio di un percorso passato direttamente a una chiamata di sistema, non è necessaria l'espansione della shell. Tale percorso non è un percorso assoluto; è ancora relativo alla posizione del processo cwd o symlink. A meno che l'autore non stia cercando di catturarti fuori parlando di quella stringa letterale (senza espansione della shell) come percorso. Penso che stai cercando di trovare delle scuse per il libro, ma sono più propenso a dire che è sbagliato e non lasciare che le cose si confondano.
Peter Cordes,
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.