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 -a和test -e(似乎根据我读过的各种文档检查任何类型文件的文件存在),它们似乎也有效.
在-ef和-a/ 之间执行的检查是否有任何区别-e?是否使用-ef某种尝试来防止文件存在时的竞争条件?
查看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)