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.
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.
chmod
setează biți de permisiune (biți rwx și sticky / setuid / setgid, …): acesta este ceea ce numim un mod ” >