首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >“测试文件-ef文件”与“测试文件文件”的区别

“测试文件-ef文件”与“测试文件文件”的区别
EN

Stack Overflow用户
提问于 2012-07-05 21:16:04
回答 2查看 592关注 0票数 6

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

代码语言:javascript
复制
if ! test /dev/slog -ef /dev/slog; then
    # do something
fi

检查文件系统中是否存在资源管理器。我已经搜索过了,但只能找到非常乏味的解释,-ef会检查这两个参数是否实际上是同一个文件。因为指定的文件名是相同的,所以它似乎只是简化为检查文件是否存在。

我检查了test -atest -e的行为(根据我读过的各种文档,这两个工具似乎都可以检查任何类型的文件是否存在),而且它们似乎也可以工作。

-ef-a/-e之间执行的检查有什么区别吗?在文件存在的情况下使用-ef是不是一种防止竞争情况的尝试?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-07-13 11:39:40

查看Ubuntu Linux的ksh副本上的strace,发现没有本质上的区别。对stat的一次调用与两次调用。

代码语言:javascript
复制
$ strace test /tmp/tmp.geLaoPkXXC -ef /tmp/tmp.geLaoPkXXC

显示了以下内容:

代码语言:javascript
复制
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

代码语言:javascript
复制
$  strace test -a /tmp/tmp.geLaoPkXXC

显示了以下内容:

代码语言:javascript
复制
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两个。

代码语言:javascript
复制
$ ksh --version
  version         sh (AT&T Research) 93u 2011-02-08
票数 4
EN

Stack Overflow用户

发布于 2012-07-13 23:28:53

我们不知道在没有代码的情况下代码是如何使用状态的,我们需要通过代码来找出差异。

代码语言:javascript
复制
/* 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的评论中知道第二个条件也是真的

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11345132

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档