shell 'test' 命令中的 '-size +0' 是什么意思

shell 'test' 命令中的 '-size +0' 是什么意思

我看到if这样的一句话:

if [ -f <file path> -size +0 ]

我知道-f检查文件是否存在,但这-size +0在这里做什么?

我无法从手册页获得帮助,也尝试搜索论坛,有点好奇找到这个帮助我。

答案1

这很可能是错误的。该形式-size +0对于find标准实用程序是合法的(并且意味着非空文件),但对于test(又名[)则不合法。脚本作者似乎在没有保留适当上下文的情况下重复使用了它。如果是这样ksh,则应进行以下检查:

–s file
    True, if file exists and has size greater than zero.

或者,该脚本适用于(我不知道的)扩展外壳,该外壳test是内部的,并且针对如此复杂的结构进行了扩展。 (你的ksh是特定的扩展版本吗?)

答案2

这是没有意义的。

如果ksh93一元运算符的参数太多并且一元运算符以 开头-,那么将选择第二个作为参数,其余的将被忽略:

$ ksh -c '[ -f a.out foo bar ] && echo yes'
yes
$ ksh -c '[ -e a.out foo a ] && echo yes'
yes

(除非第二个参数是-a/-o,否则不会被忽略)

检查来源克什93test确认该行为。

还做strace

$ { strace -p "$$" & sleep 1; [ -f a.out -size +0 ]; kill "$!"; }
[1] 18467
Process 18455 attached
restart_syscall(<... resuming interrupted call ...>) = 0
stat(".", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
stat("a.out", {st_mode=S_IFREG|0755, st_size=8320, ...}) = 0
kill(18467, SIGTERMProcess 18455 detached
 <detached ...>

其他类似 Bourne 的 shell 将报告这种情况下的错误。 POSIX 未指定该行为。


如果要检查文件是否存在并且大小是否大于 0,则标准 shell 有-s测试运算符:

[ -s file ] && echo 'file exist and size greater than 0'

ksh88也表现得一样。使用我的 Solaris 10 VM:

$ ksh -c '[ -f a.out foo bar ] && echo yes'
yes
$ strings /usr/bin/ksh | grep -i version
@(#)Version M-11/16/88i

POSIX 之前的 shell 也有类似的行为,包括 Solaris 10 中的 Bourne shell、传家宝 Bourne shell、Schily osh 和 Schily sh。

相关内容