Vilket filläge indikerar att en fil är en symbolisk länk (symlink)?
Mitt användningsfall är att upptäcka symbolisk länkar inuti ett git-arkiv (och dess historik). Jag hade intrycket av att en symlink är en symlink på grund av dess filläge, och att filläget är vad verktyget chmod
anger.
Kommentarer
Svar
Fillägen täcker två olika begrepp: filtyper och filbehörigheter. Ett fils läge representeras av värdet av st_mode
i resultatet av stat(2)
samtal och ls -l
presenterar alla tillsammans; se Förstå UNIX-behörigheter och filtyper för detaljer.
När en fil har skapats kan dess typ kan inte ändras. Dessutom kan du inte på Linux-system ange en symlink-behörighet; allt som är viktigt är målets tillstånd (och i själva verket hela läget eftersom det också bestämmer symlinkens beteende). Se Hur gäller filbehörigheter för symlänkar? för mer information. På Mac OS X kan symlänkar ha sina egna behörigheter.
Slutligen använder git
en förenklad modell med ett begränsat antal igenkända lägen:
-
040000
för en katalog -
100644
för en normal fil -
100755
för en körbar fil -
120000
för en symbolisk länk
Du kan se dessa värden med kommandon som git cat-file -p "master^{tree}"
; se Pro Git för mer information.
Svar
Vilket filläge indikerar att en fil är en symbolisk länk (symlink)?
POSIX API för att kontrollera om en fil är en symlink använder S_ISLNK
makroen.
I glibc definieras S_ISLNK
enligt följande:
#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)
dvs. en fil är en symlink if ((mode & 0170000) == 0120000)
(åtminstone på GNU / Linux).
Svar
En symlänk (även om vissa filsystem hanterar symlänkar på olika sätt) är en inode
-tabellpost som pekar på samma plats som en annan fil (eller katalog).
Till exempel om foo
är inode 1234
då bar
(a symlink till foo) är inode 1234
.
bar
existerar inte det, det är bara en pekare till en ”riktig” fil.
Symlinks
har i allmänhet inte behörigheter utanför behörigheterna för filen de pekar på. Så bar"s
behörigheter är ”samma” as foo"s
. Du kan inte ställa in behörigheter för bar
(symlink) endast på foo
(den riktiga filen).
Med detta sagt är det ”en riktigt hög nivåvy. Olika filsystem hanterar symlänkar på olika sätt. Olika verktyg hanterar symlinks
på olika sätt. Vissa filsystem” flaggar ”symlinks
och hantera dem speciellt, men vissa gör inte det.
Till exempel chmod
på Linux
kommer inte att ändra en symlinks
behörigheter men på OSX
kan du få det till. I båda fallen ändras de riktiga filbehörigheterna.
Jag kan inte tänka mig något system (tänker inte menar att det ”inte finns där) där en symlink
har behörigheter som är skilda från den riktiga filen.
Kommentarer
- Nej, en symlänk är en typ av fil (" allt är en fil ") som innehåller ett filnamn snarare än allmänt- ändamålsdata. Typiskt hänvisar detta filnamn till en befintlig fil – att ' är hela poängen med att ha symlänkar – men detta är garanterat inte sant. Ja, en symlänk (som alla andra typ av fil) har en inod. Nej, en symlänk och den fil som den pekar på har separata inoder med olika inodnummer. Hård länkar har samma inod och därmed samma inode num ber.
- ja det var tänkt att vara på hög nivå men moderna system gör ' t gör en fil på hårddisken inodtabellen innehåller strängen och ingen riktig fil är skapad. Jag tror att det ' heter " snabb symlink "
- Om ' foo ' och ' bar ' är båda pekare till nod 1234, då är de ' HÅRDA länkar, inte symlänkar. Om " bar " var en SYMlink, skulle det bokstavligen vara teckensträngen " foo " (eller till och med vägen till foo) istället för en nod. I själva verket kan du skapa en symlink som inte ' t pekar någonstans meningsfull alls, t.ex.
ln -s 'this is not a real file' bar
- Dessutom: BSD (som inkluderar Mac OS X) har ett systemanrop lchmod () som låter dig ställa in behörigheterna för själva symlinket. Jag har ingen aning om vad användningen av det är.
chmod
ställer in behörighetsbitar (rwx och sticky / setuid / setgid-bitar, …): detta kallar vi ett " -läge ". Men du verkar hänvisa till fil typer istället.