While loop até que um arquivo exista no bash

0

Eu quero escrever wait até que exista um arquivo no bash. Como faço isso?

Eu tentei isso, mas não funciona:

while [ ! -f outputs\/$trace\_hist_len_$hist_len\_page_size_$page_size\.out]; do
echo "waiting for outputs\/$trace\_hist_len_$hist_len\_page_size_$page_size\.out";
done

Parece ter um erro de sintaxe.

    
por snihalani 21.10.2012 / 22:43

2 respostas

8
while : ; do
    [[ -f "/path/to/file" ]] && break
    echo "Pausing until file exists."
    sleep 1
done

Sem usar algo como inotify , esse é o limite do que você poderá fazer.

O while acima apenas usa : como sua condicional, o que significa apenas "fazer até matarmos".

A linha importante é o teste [[ . O teste condicional aqui não usa a instrução if . Isso ocorre porque [[ é um comando real e NÃO parte da instrução if . Isso executa [[ -f "/path/to/file" ]] e o && verifica o status de saída do comando [[ e executa a seguinte instrução, se esse status de saída for 0 (sucesso). A seguinte declaração aqui é break , que fechará o loop atual em que seu script está.

Observação: em bash , é altamente recomendável usar [[ em vez de [ . Ele tem todos os recursos de [ , mas é muito mais poderoso e simples de usar.

    
por 22.10.2012 / 15:35
3

O espaço entre o argumento do arquivo e o colchete de fechamento é importante.

if [ -f "path" ]; then echo good;fi

if [-f "path"] ; then  echo bad;fi
if [ -f "path"]; then  echo bad;fi
if [-f "path" ]; then  echo bad;fi
    
por 22.10.2012 / 15:13