QNX (Neutrino 6.5.0)使用ksh的开源实现作为其shell。许多提供的脚本,包括系统启动脚本,都使用如下结构
if ! test /dev/slog -ef /dev/slog; then
# do something
fi检查文件系统中是否存在资源管理器。我已经搜索过了,但只能找到非常乏味的解释,-ef会检查这两个参数是否实际上是同一个文件。因为指定的文件名是相同的,所以它似乎只是简化为检查文件是否存在。
我检查了test -a和test -e的行为(根据我读过的各种文档,这两个工具似乎都可以检查任何类型的文件是否存在),而且它们似乎也可以工作。
在-ef和-a/-e之间执行的检查有什么区别吗?在文件存在的情况下使用-ef是不是一种防止竞争情况的尝试?
发布于 2012-07-13 11:39:40
查看Ubuntu Linux的ksh副本上的strace,发现没有本质上的区别。对stat的一次调用与两次调用。
$ strace test /tmp/tmp.geLaoPkXXC -ef /tmp/tmp.geLaoPkXXC显示了以下内容:
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...whereas
$ strace test -a /tmp/tmp.geLaoPkXXC显示了以下内容:
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一个stat vs两个。
$ ksh --version
version sh (AT&T Research) 93u 2011-02-08发布于 2012-07-13 23:28:53
我们不知道在没有代码的情况下代码是如何使用状态的,我们需要通过代码来找出差异。
/* code for -ef */
return (stat (argv[op - 1], &stat_buf) == 0
&& stat (argv[op + 1], &stat_spare) == 0
&& stat_buf.st_dev == stat_spare.st_dev
&& stat_buf.st_ino == stat_spare.st_ino);
/* code for -e/-a */
case 'a': /* file exists in the file system? */
case 'e':
return stat (argv[pos - 1], &stat_buf) == 0;因此,如果名称相同,并且两个同名的test -a/-e file ()将返回相同的值,则test file -ef file与stat相同。我们知道第一个条件是真的,我们从@tinman的评论中知道第二个条件也是真的
https://stackoverflow.com/questions/11345132
复制相似问题