@Caleb là chính xác về việc làm cho tập lệnh chỉ kiểm tra liên kết tượng trưng. Tuy nhiên phần về lý do bị bỏ rơi và tôi tò mò. Nếu bạn nhìn vào mã nguồn coreutils và tìm ra kết quả kiểm tra, bạn có thể thấy rằng khi bạn chạy kiểm tra liên kết tượng trưng, nó sử dụng lstat và nếu bạn sử dụng kiểm tra -f thì nó thực sự gọi là 'stat' theo liên kết tượng trưng:
$ 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
Từ trang 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.
Điều này có nghĩa là kiểm tra -f sẽ trả về đúng miễn là tên tệp được chỉ định là một liên kết tượng trưng đến một tệp thông thường hoặc chính một tệp thông thường.
-e
và-f
được-e
sử dụng để biết liệu một tệp (thuộc bất kỳ loại nào) có tồn tại hay không và-f
đặc biệt để kiểm tra xem tệp có tồn tại và là một tệp thông thường hay không. Có vẻ như tôi đã hiểu nhầm "tập tin thông thường" là gì ..