6

QNX (Neutrino 6.5.0) は、ksh のオープン ソース実装をシェルとして使用します。システム起動スクリプトを含む、提供されているスクリプトの多くは、次のような構造を使用します。

if ! test /dev/slog -ef /dev/slog; then
    # do something
fi

ファイルシステムにリソースマネージャーが存在するかどうかを確認します。私が検索したところ-ef、2 つのパラメーターが実際に同じファイルであるかどうかを確認する非常に単調な説明しか見つかりませんでした。指定されたファイル名は同じであるため、ファイルが存在することを確認するだけのようです。

test -aandの動作を確認しましたtest -e(私が読んださまざまなドキュメントによると、どちらもあらゆるタイプのファイルのファイルの存在を確認しているようです)、それらも機能しているようです。

-ef-a/の間で実行されるチェックに違いはあります-eか? -efファイルの存在下で競合状態から保護するために何らかの試みを使用していますか?

4

2 に答える 2

4

Ubuntu straceLinux のコピーを確認するとksh、実質的な違いはありません。statvs twoへの 1 つの呼び出し。

$ 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

...一方

$  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

1stat対2。

$ ksh --version
  version         sh (AT&T Research) 93u 2011-02-08
于 2012-07-13T03:39:40.043 に答える
1

コードがコードなしで統計を正確に使用する方法はわかりません。コードを介して違いを見つける必要があります。

/* 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;

したがって、名前が同じで、同じ名前の2つのstat()が同じ値を返す場合、はと同じになり test -a/-e fileますtest file -ef file。@tinmanからのコメントから、最初の条件が真であり、2番目の条件も真であることがわかります。

于 2012-07-13T15:28:52.590 に答える