@Calebは、シンボリックリンクをテストするだけのスクリプトを作成することについて正しいです。しかし、なぜかに関する部分は省かれ、私は興味がありました。coreutilsのソースコードを見てテストの出力を追跡すると、シンボリックリンクテストを実行するとlstatが使用され、-fテストを使用すると実際にシンボリックリンクに続く「stat」が呼び出されることがわかります:
$ ln -s varnish_config XXX
$ strace -s 2000 test -L XXX 2>&1 | grep XXX
execve("/usr/bin/test", ["test", "-L", "XXX"], [/* 47 vars */]) = 0
lstat("XXX", {st_mode=S_IFLNK|0777, st_size=14, ...}) = 0
$ strace -s 2000 test -L varnish_config 2>&1 | grep varnish
execve("/usr/bin/test", ["test", "-L", "varnish_config"], [/* 47 vars */]) = 0
lstat("varnish_config", {st_mode=S_IFREG|0664, st_size=1046, ...}) = 0
$ strace -s 2000 test -f XXX 2>&1 | grep XXX
execve("/usr/bin/test", ["test", "-f", "XXX"], [/* 47 vars */]) = 0
stat("XXX", {st_mode=S_IFREG|0664, st_size=1046, ...}) = 0
statのmanページから:
stat() stats the file pointed to by path and fills in buf.
lstat() is identical to stat(), except that if path is a symbolic link,
then the link itself is stat-ed, not the file that it refers to.
これは、指定されたファイル名が通常のファイルまたは通常のファイル自体へのシンボリックリンクである限り、-fテストがtrueを返すことを意味します。
-eとは、-fそれをした-e(任意の型の)ファイルが存在するかどうかを知るために使用し、-fファイルが存在し、通常のファイルであった場合、テストに特異でした。「通常のファイル」とは何かを誤解したようです