Ce mod de fișier indică faptul că un fișier este o legătură simbolică (link simbolic)?


Cazul meu de utilizare este să detectez simbolic linkuri într-un depozit git (și istoricul acestuia). Am avut impresia că un link simbolic este un link simbolic datorită modului său de fișier și că modul fișier este setul pe care instrumentul chmod îl setează.

Comentarii

. Dar se pare că vă referiți la tipuri de fișiere.

  • @JohnWHSmith Aș fi nerăbdător să votez un link către documente care să distingă diferențele dintre modurile de fișier și tipurile de fișiere! : D
  • Răspuns

    Modurile fișier acoperă două noțiuni diferite: tipuri de fișiere și permisiuni de fișiere. Modul unui fișier este reprezentat de valoarea st_mode în rezultatul apelurilor stat(2) și ls -l le prezintă pe toate împreună; consultați Înțelegerea permisiunilor UNIX și a tipurilor de fișiere pentru detalii.

    Odată ce un fișier este creat, tipul său poate fi nu se poate schimba. În plus, pe sistemele Linux nu puteți specifica permisiunile unui link simbolic; tot ceea ce contează este permisiunea țintei (și efectiv modul complet, deoarece asta determină și comportamentul legăturii simbolice). Consultați Cum se aplică permisiunile de fișiere legăturilor simbolice? pentru detalii. Pe Mac OS X, legăturile simbolice pot avea propriile permisiuni.

    În cele din urmă, git folosește un model simplificat, cu un număr limitat de moduri recunoscute:

    • 040000 pentru un director
    • 100644 pentru un fișier normal
    • 100755 pentru un fișier executabil
    • 120000 pentru o legătură simbolică

    Puteți vedea aceste valori folosind comenzi precum git cat-file -p "master^{tree}"; consultați Pro Git pentru detalii.

    Răspuns

    Ce mod de fișier indică faptul că un fișier este o legătură simbolică (link simbolic)?

    API POSIX de verificat dacă un fișier este un link simbolic folosește macro-ul S_ISLNK.

    În glibc, S_ISLNK este definit după cum urmează:

    #define __S_IFMT 0170000 /* These bits determine file type. */ #define __S_IFLNK 0120000 /* Symbolic link. */ #define __S_ISTYPE(mode, mask) (((mode) & __S_IFMT) == (mask)) #define S_ISLNK(mode) __S_ISTYPE((mode), __S_IFLNK) 

    adică un fișier este un link simbolic if ((mode & 0170000) == 0120000) (cel puțin pe GNU / Linux).

    Răspuns

    O legătură simbolică (deși unele sisteme de fișiere gestionează legăturile simbolice diferit) este o intrare de tabel inode care indică același loc cu un alt fișier (sau director).

    De exemplu, dacă foo este inode 1234 atunci bar (a link simbolic către foo) este inode 1234.

    bar nu există într-adevăr, este doar un pointer către un fișier „real”.

    Symlinks, în general, nu au permisiuni în afara permisiunilor fișierului către care se îndreaptă. Deci, bar"s permisiunile sunt „la fel” as foo"s. Nu puteți seta permisiuni pe bar (link-ul simbolic) numai pe foo (fișierul real).

    Acestea fiind spuse, „este o vizualizare cu adevărat la nivel înalt. Diferite sisteme de fișiere gestionează legăturile simbolice diferit. Diferite instrumente gestionează diferit symlinks în mod diferit. Unele sisteme de fișiere„ marchează ” div id = „21a5bf944f”>

    și le gestionează special, dar unele nu le fac.

    De exemplu, chmod pe Linux nu a schimbat un symlinks permisiuni, dar pe OSX îl puteți obține. În ambele cazuri, permisiunile pentru fișierele reale sunt modificate.

    Nu pot să mă gândesc la niciun sistem (nu este înseamnă că nu este acolo) în care un symlink are permisiuni separate de fișierul real.

    Comentarii

    • Nu, o legătură simbolică este un tip de fișier (” totul este un fișier „) care conține un nume de fișier mai degrabă decât general- date de scop. De obicei, acest nume de fișier se referă la un fișier existent – care ‘ este întregul punct de a avea legături simbolice – dar acest lucru nu este garantat că este adevărat. Da, un link simbolic (ca oricare altul tipul de fișier) are un inod. Nu, un link simbolic și fișierul pe care îl indică pentru a avea inoduri separate, cu numere de inod diferite. Hard link-urile au același inod și, astfel, același inod num ber.
    • ei trebuia să fie de nivel înalt, dar sistemele moderne nu ‘ nu fac un fișier pe hard disk, tabelul inode conține șirul și niciun fișier real nu este creată. Cred că ‘ se numește ” link simbolic rapid ”
    • Dacă ‘ foo ‘ și ‘ bara ‘ sunt ambii indicatori către nodul 1234, apoi ‘ sunt legături HARD, nu linkuri simbolice. Dacă ” bara ” ar fi un SYMlink, atunci ar fi literalmente șirul de caractere ” foo ” (sau chiar calea către foo) în locul unui nod. De fapt, puteți crea un link simbolic care să nu ‘ să indice niciodată semnificativ, de ex. ln -s 'this is not a real file' bar
    • De asemenea: BSD (care include Mac OS X) are un apel de sistem lchmod () care vă va permite să setați permisiunile legăturii simbolice în sine. Habar n-am ce folos este.

    Lasă un răspuns

    Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *