O que significa '-size +0' no comando shell 'test'

3

Me deparei com uma declaração if como esta:

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

Eu sei que -f verifica se o arquivo existe, mas o que isso -size +0 faz aqui?

Não consigo obter ajuda na página de manual do man também tentei procurar em fóruns, pouco curioso para descobrir que isso me ajude.

    
por Jeeva 01.03.2016 / 06:11

2 respostas

2

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.

    
por 01.03.2016 / 09:06
4

Provavelmente, isso é errôneo. O formulário -size +0 é válido para o utilitário find standard (e significa um arquivo não vazio), mas não para test (a.k.a. [ ). Parece que o autor do script reutilizou sem manter o contexto adequado. Se isso for ksh , ele deve ter a seguinte verificação:

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

Como alternativa, esse script é para um shell estendido (desconhecido para mim) para o qual test é interno e estendido para essas construções complexas. (Seu ksh é uma versão estendida específica?)

    
por 01.03.2016 / 08:17