"test -a file"和"test file -ef file"之间的区别

tin*_*man 6 ksh qnx

QNX(Neutrino 6.5.0)使用ksh的开源实现作为其shell.许多提供的脚本(包括系统启动脚本)都使用诸如的结构

if ! test /dev/slog -ef /dev/slog; then
    # do something
fi
Run Code Online (Sandbox Code Playgroud)

检查文件系统中是否存在资源管理器.我搜索过,只能找到非常严厉的解释,-ef检查两个参数是否实际上是同一个文件.由于指定的文件名是相同的,它似乎只是减少到检查文件是否存在.

我检查过的行为test -atest -e(似乎根据我读过的各种文档检查任何类型文件的文件存在),它们似乎也有效.

-ef-a/ 之间执行的检查是否有任何区别-e?是否使用-ef某种尝试来防止文件存在时的竞争条件?

Bri*_*ain 4

查看straceUbuntu Linux 上的副本ksh发现没有实质性差异。一通电话statvs 两通电话。

$ strace test /tmp/tmp.geLaoPkXXC -ef /tmp/tmp.geLaoPkXXC
Run Code Online (Sandbox Code Playgroud)

显示了这个:

mmap(NULL, 7220736, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f11dc80b000
close(3)                                = 0
stat("/tmp/tmp.geLaoPkXXC", {st_mode=S_IFREG|0600, st_size=0, ...}) = 0
stat("/tmp/tmp.geLaoPkXXC", {st_mode=S_IFREG|0600, st_size=0, ...}) = 0
close(1)                                = 0
close(2)                                = 0
Run Code Online (Sandbox Code Playgroud)

...然而

$  strace test -a /tmp/tmp.geLaoPkXXC
Run Code Online (Sandbox Code Playgroud)

显示了这个:

fstat(3, {st_mode=S_IFREG|0644, st_size=7220736, ...}) = 0
mmap(NULL, 7220736, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f6b49e2b000
close(3)                                = 0
stat("/tmp/tmp.geLaoPkXXC", {st_mode=S_IFREG|0600, st_size=0, ...}) = 0
close(1)                                = 0
close(2)                                = 0
Run Code Online (Sandbox Code Playgroud)

stat对二。

$ ksh --version
  version         sh (AT&T Research) 93u 2011-02-08
Run Code Online (Sandbox Code Playgroud)