Não tem sentido.
Esse é o jeito que ksh93
manipula se houver muitos argumentos para um operador unário e o operador unário começar com -
, então o segundo será escolhido como argumento e o restante será ignorado:
$ ksh -c '[ -f a.out foo bar ] && echo yes'
yes
$ ksh -c '[ -e a.out foo a ] && echo yes'
yes
(Exceto quando o segundo argumento for -a/-o
, não será ignorado)
Verificando a fonte de ksh93 test
confirme esse comportamento.
Também fazendo 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 ...>
Outros shells parecidos com Bourne reportarão o erro com este caso. O comportamento não é especificado por POSIX.
Se você quiser verificar se existe um arquivo com tamanho maior que 0, os shells padrão terão -s
test operator:
[ -s file ] && echo 'file exist and size greater than 0'
ksh88
também se comporta da mesma forma. Com minha VM do Solaris 10:
$ ksh -c '[ -f a.out foo bar ] && echo yes'
yes
$ strings /usr/bin/ksh | grep -i version
@(#)Version M-11/16/88i
Cascas pré-POSIX também se comportam assim, incluem shell Bourne no Solaris 10, o shell Bourne de herança, Schily osh e Schily sh.