シンボリックリンクはどのファイルモードですか?

シンボリックリンクはどのファイルモードですか?

ファイルがシンボリックリンクであることを示すファイルモードは何ですか?


私の使用例は、gitリポジトリ(およびその履歴)内でシンボリックリンクを検出することです。私の考えでは、シンボリックリンクはファイルモードのためにシンボリックリンクであり、ファイルモードはchmodツールによって設定されるということです。

答え1

ファイルモードは、ファイルタイプとファイル権限の2つの概念をカバーします。ファイルのモードは呼び出しst_mode結果の値として表示され、stat(2)一緒にls -l表示されます。UNIXの権限とファイルタイプの理解もっと学ぶ。

ファイルが生成されると、そのタイプは変更できません。また、Linux システムではシンボリックリンクの権限を指定できません。重要なのはターゲットの権限です(シンボリックリンクの動作も決定するため、実際にはフルモード)。バラよりファイル権限はシンボリックリンクにどのように適用されますか?もっと学ぶ。 Mac OS Xでは、シンボリックリンクに独自の権限を持つことができます。

最後に、git識別可能なパターンの数が制限された単純化されたモデルを使用します。

  • 040000ディレクトリの場合
  • 100644一般ファイルの場合
  • 100755実行ファイルの場合
  • 120000シンボリックリンクの場合

次のコマンドを使用してこれらの値を表示できますgit cat-file -p 'master^{tree}'Gitのプロフェッショナルバージョンもっと学ぶ。

答え2

ファイルがシンボリックリンクであることを示すファイルモードは何ですか?

POSIX APIマクロを使用して、ファイルがシンボリックリンクであることを確認してくださいS_ISLNK

glibc では、S_ISLNK次のように定義されます。

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

つまり、ファイルはif ((mode & 0170000) == 0120000)(少なくともGNU / Linuxでは)シンボリックリンクです。

答え3

シンボリックリンク(一部のファイルシステムではシンボリックリンクを異なる方法で処理しますが)は、inode他のファイル(またはディレクトリ)と同じ場所を指すテーブルエントリです。

たとえば、 if foois inode 1234then bar(foo へのシンボリックリンク) is ですinode 1234

bar実際には存在せず、「実際の」ファイルへのポインタだけです。

Symlinks通常、指すファイルの権限以外の権限はありません。したがって、bar's権限は「同じ」ですas foo's。 (実ファイル)barのみ(シンボルリンク)権限を設定できませんfoo

言い換えれば、これは非常に高いレベルの見解です。ファイルシステムごとにシンボリックリンクを異なる方法で処理します。他のツールはそれをsymlinks異なる方法で処理します。一部のファイルシステムはこれを「表示」symlinksし、具体的に処理しますが、一部はそうではありません。

たとえば、chmodonは権限をLinux変更しませんが、権限を取得できます。どちらの場合も、実際のファイル権限が変更されます。symlinksOSX

symlinkaが実際のファイルとは別の権限を持つシステムは考えられません(存在しないという意味ではありません)。

関連情報