我看到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。