Diferența dintre ./ și ~/ (Programare, Filepath, Tilde)

Tot Zam a intrebat.

La crearea de trasee de fișiere și URL-uri, am observat că de multe ori calea începe cu ./ sau ~/.

Care este diferența dintre căile de acces la fișiere care încep cu ./ și ~/?

Ce înseamnă fiecare dintre ele?

5 răspunsuri
David

./ înseamnă „pornind de la directorul curent”. . se referă la directorul de lucru curent, deci ceva de genul ./foo.bar ar căuta un fișier numit foo.bar în directorul curent. (Ca o notă secundară, .. înseamnă că se referă la directorul părinte al directorului curent. Așadar, ../foo.bar ar căuta acel fișier cu un director mai sus).

~/ înseamnă „pornind de la directorul principal”. Acest lucru ar putea avea semnificații diferite în scenarii diferite. De exemplu, într-un mediu Unix ~/foo.bar ar căuta un fișier numit foo.bar în directorul de domiciliu, ceva de genul /home/totzam/foo.bar. În multe aplicații web, ~/foo.bar ar căuta un fișier numit foo.bar în rădăcina aplicației web, ceva de genul /var/http/mywebapp/foo.bar.

tripleee

De dragul completitudinii …

  • path este un fișier sau un director numit path în directorul curent.
  • ./path este un fișier sau un director numit path în directorul curent, cu directorul scris în litere. . este directorul curent, iar path este numele fișierului sau al directorului din directorul curent.
  • ~/path este o prescurtare pentru $HOME/path unde $HOME este o variabilă care se referă la directorul dvs. personal. În mod normal, directorul dvs. de origine va fi undeva de genul /home/you sau /Users/you unde you este numele contului dumneavoastră. (Comanda echo "$HOME" va afișa directorul dvs. personal). Valoarea extinsă este o cale absolută (cu excepția cazului în care ați încurcat valoarea lui $HOME temeinic), așa cum este indicat de slash-ul inițial.
  • /path este o cale absolută care se referă la un fișier sau un director numit path care se află în directorul root director /. Fiecare fișier pe Unix se află în cele din urmă undeva în arborele de directoare care începe cu directorul rădăcină.

Fiecare nume de fișier care începe cu / este un fișier absolut absolută (cunoscută și sub numele de calea completă) care explică modul în care se ajunge la un anumit nod pornind de la directorul rădăcină. De exemplu, /var/tmp/you/reminder.txt se referă la un fișier sau director reminder.txt (probabil un fișier, judecând după nume; dar Unix nu se interesează cum se numesc fișierele sau directoarele) care se află în directorul you care se află în directorul tmp care se află în director var care se află în directorul rădăcină.

Fiecare nume de fișier care nu începe cu / este un relativ care indică modul în care se ajunge la un anumit fișier sau director pornind de la directorul curent. Directorul special .. este directorul părinte, iar directorul special . este directorul curent. Astfel, path/there se referă la fișierul sau directorul there din interiorul directorului path din directorul curent; și (treceți mouse-ul peste zona gri pentru a afișa spoilerul)

there/.././and/back/.. este un mod (foarte complicat) de a face referire la directorul and din directorul curent, în care traversăm directorul there director și apoi ne întoarcem la directorul curent; apoi rămânem în directorul curent; apoi ne referim la directorulback în interiorul directorului and, , dar apoi ne întoarcem la directorul părinte al acestuia, terminând cu ./and.

În plus față de ~/ pentru directorul principal al utilizatorului curent, unele shell-uri și aplicații permit notația ~them/ pentru a se referi la directorul principal al contului de utilizator them. De asemenea, unele configurații de servere web permit fiecărui utilizator să aibă un site web public în directorul său ~/public_html iar notația URL http://server/~them/ ar servi site-ul contului de utilizator them pentru vizitatorii externi.

Directorul curent este o comoditate pe care shell-ul o oferă pentru a nu fi nevoit să tastați tot timpul căi lungi. Puteți, dacă doriți, să o faceți.

/bin/ls /home/you/Documents/unix-101/directories.txt

este un mod lung, dar perfect valabil de a spune (presupunând că vă aflați în directorul dvs. principal),

ls Documents/unix-101/directories.txt

De asemenea, ați putea spune

cd Documents/unix-101
ls directories.txt

și până când cd din nou, toate comenzile dvs. vor fi executate în acest director.

(Există o diferență în faptul că ls va imprima și calea fișierelor pe care îi cereți să le listeze. Deci ls directories.txt va imprima pur și simplu directories.txt în timp ce ls Documents/unix-101/directories.txt va imprima … asta).

Întotdeauna puteți pune o cale absolută în locul uneia relative sau invers; și, în general, nu trebuie să nevoie de de cd nicăieri în mod special (cu excepția unor scripturi pentru începători, practic stricate, care au tendința de a vă cere să vă aflați într-un anumit director atunci când le executați).

O greșeală comună a începătorilor este să presupună că locația unui script sau a unui executabil dictează unde caută fișierele; dar dacă ar fi adevărat, ls . ar afișa fișierele în directorul bin în loc de directorul curent, nu-i așa?

Când vă conectați pentru prima dată, directorul de lucru curent este setat la directorul dvs. personal.

Un „director” este uneori numit „folder” de către persoanele care nu sunt încă suficient de bătrâne pentru a prefera primul termen.


Observați cum arată de aici ls trebuie să fie un fișier în directorul curent, și totuși spunem și că se află în /bin? Aceasta este o altă întrebare (căutați $PATH).

Când . nu se află în PATH (așa cum în general nu ar trebui să fie), trebuie să spuneți ./scriptname în loc de scriptname pentru a rula comenzile într-un fișier executabil numit scriptname în directorul curent. Cu alte cuvinte, acesta este un caz de colț în care trebuie să scrieți în mod explicit ./ pentru a specifica ceva în directorul curent (sau, în mod echivalent, dar verosimil, pentru a preciza calea absolută completă, poate cu o substituție de comandă $(pwd)/scriptname dar aceasta este de fapt pleonastic.)

De asemenea, nu confundați numele de director . cu comanda din shell-ul Bourne care cuprinde un singur punct (cunoscută și prin aliasul său Bash source). Comanda

. ./scriptname

execută comenzile din fișierul ./scriptname în contextul instanței curente a shell-ului, spre deosebire de un subshell separat (ceea ce este ceea ce doar ./scriptname face). Cu alte cuvinte, această linie de comandă invocă comanda comanda dot pe un fișier scriptname în instanța directorul dot.

Comentarii

  • Îmi place explicația dvs. cu privire la modul în care ~/path este o prescurtare pentru $HOME/path. Cu siguranță ar fi făcut lucrurile mai clare atunci când am pus această întrebare când am început să programez și sunt sigur că și alții vor găsi explicația utilă în viitor. Vă mulțumim pentru acest răspuns detaliat chiar și după 3+ ani! –  > Por Tot Zam.
  • Foarte bună explicația. În ceea ce privește caracterul tilde (~), înseamnă de fapt să iei tot ce se află între ~ și primul / și să tratezi asta ca pe un nume de utilizator. Dacă acel spațiu este gol, cum ar fi ~/ sau dacă utilizatorul nu există, atunci se folosește implicit utilizatorul curent. Acest lucru ar putea duce la probleme dacă un script este rulat ca un alt utilizator sau ca root folosind sudo și un șir de caractere rău intenționat. –  > Por Michael Treanor.
  • @Skeptycal Mulțumesc, tocmai mă gândeam să adaug un pasaj despre ~user. S-a făcut acum. –  > Por tripleee.
  • Asta se aplică în linii mari și la Windows și DOS și la alte câteva atrocități similare, cu diferența că DOS etc. are mai multe sisteme de fișiere, fiecare cu o literă de unitate separată (iar separatorul era backslash-ul în loc de slash înainte /). În mod obișnuit, C: era rădăcina primului hard disk (iar A: a fost rădăcina primei unități de dischetă) în zilele 286, deși există variații. –  > Por tripleee.
vadian

./ este directorul curent

~/ este directorul principal al utilizatorului curent

fillo

./ înseamnă că calea este relativă la poziția curentă.

~/ înseamnă că calea este relativă la directorul dvs. personal.

Harshit

Vă voi explica un exemplu simplu. După cum au menționat dezvoltatorii:

  • ./ este directorul curent.
  • ~/ este directorul principal al utilizatorului curent.

Cum ne pot ajuta ambele expresii ale căilor de acces la fișiere? Să presupunem că doriți să executați un script (.sh) și vă aflați în același director în care există fișierul, atunci puteți face acest lucru pur și simplu ./filename.sh

Eu folosesc în general ~/ pentru a accesa fișierele din directorul meu personal, cum ar fi .bashrc atunci când vreau să adaug orice configurație în el. Este mai ușor, deoarece expresia căii de acces la fișier (pentru directorul de domiciliu) pare mult mai ușoară și face ca fișierul să fie accesibil de oriunde, fără să vă faceți griji cu privire la calea de acces sau la modificarea acesteia.