我正在尝试为与 NFS 相关的错误创建一个测试用例,每当我检查它时,它rm -rf
都会失败并显示“目录不为空”。但是,简单的测试脚本无法重现该错误,因此我尝试编写一个脚本来创建一些目录树,用文件填充它,然后删除该树。由于我怀疑问题与某些文件名缓存有关,因此我使用它mktemp
来创建这样的随机名称:
#!/bin/sh
set -x
readonly LEVELS=6
readonly BASE_DIR=test-dir
DIR="$BASE_DIR"
for (( level=0; level < LEVELS; ++level ))
do
if (( level > 0 )); then
DIR="$(mktemp -p "$DIR")" || exit
else
mkdir "$DIR" || exit
fi
for (( i=0; i < 4; ++i ))
do
date > $(mktemp -p "$DIR") || exit
done
sleep 0.5
done
rm -rf "$BASE_DIR"
然而,脚本以一种我无法理解的方式失败了,如下所示:
> ./test-script.sh
+ readonly LEVELS=6
+ LEVELS=6
+ readonly BASE_DIR=test-dir
+ BASE_DIR=test-dir
+ DIR=test-dir
+ (( level=0 ))
+ (( level < LEVELS ))
+ (( level > 0 ))
+ mkdir test-dir
+ (( i=0 ))
+ (( i < 4 ))
+ date
++ mktemp -p test-dir
+ (( ++i ))
+ (( i < 4 ))
+ date
++ mktemp -p test-dir
+ (( ++i ))
+ (( i < 4 ))
+ date
++ mktemp -p test-dir
+ (( ++i ))
+ (( i < 4 ))
+ date
++ mktemp -p test-dir
+ (( ++i ))
+ (( i < 4 ))
+ sleep 0.5
+ (( ++level ))
+ (( level < LEVELS ))
+ (( level > 0 ))
++ mktemp -p test-dir
+ DIR=test-dir/tmp.iIbUu2ZDDN
+ (( i=0 ))
+ (( i < 4 ))
+ date
++ mktemp -p test-dir/tmp.iIbUu2ZDDN
mktemp: failed to create file via template ‘test-dir/tmp.iIbUu2ZDDN/tmp.XXXXXXXXXX’: Not a directory
./test-script.sh: line 15: $(mktemp -p "$DIR"): ambiguous redirect
+ exit
所以mktemp -p test-dir
没有问题,但mktemp -p test-dir/tmp.iIbUu2ZDDN
有。这可能是 中的错误mktemp
,还是看起来像我实际上正在寻找的错误?
我知道我的使用mktemp
有点不典型,但无论如何。二进制文件来自coreutils-8.32-150400.9.6.1.x86_64
(SLES15 SP6)。
列出失败后的目录我看到:
r> ll test-dir/
total 16
-rw------- 1 windl dvmed 32 Mar 13 12:03 tmp.gbslFgK2eD
-rw------- 1 windl dvmed 0 Mar 13 12:03 tmp.iIbUu2ZDDN
-rw------- 1 windl dvmed 32 Mar 13 12:03 tmp.lR5NM8zLtb
-rw------- 1 windl dvmed 32 Mar 13 12:03 tmp.p5Xcfqa3Xr
-rw------- 1 windl dvmed 32 Mar 13 12:03 tmp.YRELcRCk6G
我猜测“模糊重定向”是由于mktemp
未能创建有效的文件名造成的。