Mikä tiedostotila osoittaa, että tiedosto on symbolinen linkki (symlink)?


Minun käyttötapani on tunnistaa symbolinen linkit git-arkiston sisällä (ja sen historia). Minusta tuntui, että symlink on symboli sen tiedostotilan vuoksi, ja työkalut chmod asettaa tämän tiedostotilan.

Kommentit

  • Katso superuser.com/questions/303040/…
  • Vaikuttaa siltä, että kysymykseni on ehkä parempi kysyä ' mitkä tiedostotilat ovat symlinkkejä git '.
  • stackoverflow.com/questions/15465436/git-how-to-handle-symlinks
  • chmod asettaa käyttöoikeusbittejä (rwx ja tahmea / setuid / setgid bittiä, …): Tätä kutsutaan " -tilaksi ". Mutta näytät viittaavan sen sijaan tiedostotyyppeihin .
  • @JohnWHSmith Haluaisin innokkaasti äänestää linkin asiakirjoihin, joissa erotetaan tiedostotilojen ja tiedostotyyppien erot! : D

vastaus

Tiedostotilat kattavat kaksi eri käsitettä: tiedostotyypit ja tiedostojen käyttöoikeudet. Tiedoston ”s” -tilaa edustaa arvo st_mode stat(2) -puhelujen ja ls -l esittelee ne kaikki yhdessä; katso lisätietoja kohdasta UNIX-käyttöoikeuksien ja tiedostotyyppien ymmärtäminen .

Kun tiedosto on luotu, sen tyyppi voi ”ei muuteta. Lisäksi Linux-järjestelmissä et voi määrittää symlinkin käyttöoikeuksia; Ainoa merkitys on kohteen luvalla (ja käytännössä koko tilassa, koska se määrää myös symlinkin käyttäytymisen). Katso lisätietoja kohdasta Kuinka tiedoston oikeudet koskevat symlinkkejä? . Mac OS X: ssä symlinkeillä voi olla omat käyttöoikeutensa.

Lopuksi git käyttää yksinkertaistettua mallia, jossa on rajoitettu määrä tunnistettuja tiloja:

  • 040000 hakemistolle
  • 100644 normaalille tiedostolle
  • 100755 suoritettavalle tiedostolle
  • 120000 symboliselle linkille

Näet nämä arvot käyttämällä komentoja, kuten git cat-file -p "master^{tree}"; katso lisätietoja kohdasta Pro Git .

Vastaa

Mikä tiedostotila osoittaa, että tiedosto on symbolinen linkki (symlink)?

Tarkistettava POSIX-sovellusliittymä jos tiedosto on symlinkki, käyttää S_ISLNK -makroa.

Glibc-määritelmässä S_ISLNK määritetään seuraavasti:

#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) 

ie tiedosto on symlink if ((mode & 0170000) == 0120000) (ainakin GNU / Linuxissa).

Vastaa

Symlink (vaikka jotkin tiedostojärjestelmät käsittelevät symlinkkejä eri tavalla) on inode taulukon merkintä, joka osoittaa samaan paikkaan kuin toinen tiedosto (tai hakemisto).

Esimerkiksi jos foo on inode 1234, sitten bar (a symlink to foo) on inode 1234.

bar ei todellakaan ole olemassa, se on vain osoitin ”oikea” tiedosto.

Symlinks yleensä ei ole oikeuksia sen tiedoston käyttöoikeuksien ulkopuolella, johon he osoittavat. Joten bar"s -oikeudet ovat ”sama” as foo"s. Et voi asettaa oikeuksia bar (symlink) vain foo (oikea tiedosto).

Tästä huolimatta se on todella korkean tason näkymä. Eri tiedostojärjestelmät käsittelevät symlinkkejä eri tavalla. Eri työkalut käsittelevät symlinks eri tavalla. Jotkut tiedostojärjestelmät ”merkitsevät” symlinks ja käsittele niitä erityisesti, mutta jotkut eivät.

Esimerkiksi chmod sivustolla Linux ei muuta symlinks käyttöoikeudet, mutta OSX -palvelussa voit saada sen. Molemmissa tapauksissa todellisten tiedostojen käyttöoikeuksia muutetaan.

En voi ajatella mitään järjestelmää (ei ”t” tarkoittaa sitä, ettei sitä ole siellä, missä symlink: llä on erilliset oikeudet todellisesta tiedostosta.

Kommentit

  • Ei, symlink on tiedostotyyppi (" kaikki on tiedosto "), joka sisältää tiedostonimen eikä yleistä- tarkoitustiedot. Tyypillisesti tämä tiedostonimi viittaa olemassa olevaan tiedostoon – joka ' on symlinkkien koko kohta – mutta tämän ei voida taata olevan totta. Kyllä, symlink (kuten kaikki muutkin) tiedostotyypillä) on inode. Ei, symlinkillä ja tiedostolla, jonka mukaan sillä on erilliset inodit, joilla on erilaiset inodinumerot. Hard -linkeillä on sama inode ja siten sama inodinumero Ber.
  • No, sen oli tarkoitus olla korkeatasoista, mutta nykyaikaiset järjestelmät eivät ' t tee kiintolevylle tiedostoa, jonka inoditaulukko sisältää merkkijonon, eikä oikeaa tiedostoa ole luotu. Mielestäni sitä ' kutsutaan nimellä " nopea symlink "
  • Jos ' foo ' ja ' bar ' ovat molemmat osoittimia solmuun 1234, sitten ne ' ovat HARD-linkkejä, ei symlinkkejä. Jos " bar " olisi SYMlink, se olisi kirjaimellisesti merkkijono " foo " (tai jopa polku foon) solmun sijaan. Itse asiassa voit luoda symlinkin, joka ' ei osoita mitään merkityksellistä, esim. ln -s 'this is not a real file' bar
  • Lisäksi: BSD: llä (joka sisältää Mac OS X: n) on järjestelmäkutsu lchmod (), jonka avulla voit asettaa itse symlinkin käyttöoikeudet. Minulla ei ole aavistustakaan, mikä on sen käyttö.

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *