ファイルがシンボリックリンクであることを示すファイルモードは何ですか?
私の使用例は、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 foo
is inode 1234
then bar
(foo へのシンボリックリンク) is ですinode 1234
。
bar
実際には存在せず、「実際の」ファイルへのポインタだけです。
Symlinks
通常、指すファイルの権限以外の権限はありません。したがって、bar's
権限は「同じ」ですas foo's
。 (実ファイル)bar
のみ(シンボルリンク)権限を設定できませんfoo
。
言い換えれば、これは非常に高いレベルの見解です。ファイルシステムごとにシンボリックリンクを異なる方法で処理します。他のツールはそれをsymlinks
異なる方法で処理します。一部のファイルシステムはこれを「表示」symlinks
し、具体的に処理しますが、一部はそうではありません。
たとえば、chmod
onは権限をLinux
変更しませんが、権限を取得できます。どちらの場合も、実際のファイル権限が変更されます。symlinks
OSX
symlink
aが実際のファイルとは別の権限を持つシステムは考えられません(存在しないという意味ではありません)。