Estou trabalhando em um script de shell que faz certas alterações em um arquivo txt apenas se ele existir, no entanto, esse loop de teste não funciona, eu me pergunto por quê? Obrigado!
while [ ! -f /tmp/list.txt ] ;
do
sleep 2
done
Estou trabalhando em um script de shell que faz certas alterações em um arquivo txt apenas se ele existir, no entanto, esse loop de teste não funciona, eu me pergunto por quê? Obrigado!
while [ ! -f /tmp/list.txt ] ;
do
sleep 2
done
Respostas:
Quando você diz "não funciona", como sabe que não funciona?
Você pode tentar descobrir se o arquivo realmente existe adicionando:
while [ ! -f /tmp/list.txt ]
do
sleep 2 # or less like 0.2
done
ls -l /tmp/list.txt
Você também pode se certificar de que está usando um shell Bash (ou relacionado) digitando 'echo $ SHELL'. Acho que CSH e TCSH usam uma semântica ligeiramente diferente para este loop.
while [ ! -f /tmp/list.txt ]; do sleep 2; done; ls -l /tmp/list.txt
Se você estiver no Linux e tiver o inotify-tools instalado, você pode fazer isso:
file=/tmp/list.txt
while [ ! -f "$file" ]
do
inotifywait -qqt 2 -e create -e moved_to "$(dirname $file)"
done
Isso reduz o atraso introduzido pelo hibernar enquanto ainda pesquisa a cada "x" segundos. Você pode adicionar mais eventos se antecipar que eles são necessários.
--exclude
que filtrar os nomes dos arquivos, mas não --include
ignorar tudo, exceto o nome do arquivo. O comando acima deve usar o -qq
argumento em vez de >&/dev/null
embora.
--timeout
, não a frequência de verificação, não? O ponto de inotifywait é que não há votação
inotifywait
pode travar indefinidamente se um arquivo for criado antes de começar a escutar eventos.
Eu me deparei com um problema semelhante e isso me trouxe até aqui, então eu só queria deixar a minha solução para qualquer pessoa que tenha a mesma experiência.
Descobri que, se executasse, cat /tmp/list.txt
o arquivo estaria vazio, embora eu tivesse certeza de que havia conteúdo sendo colocado imediatamente no arquivo. Acontece que se eu colocar um sleep 1;
pouco antes de cat /tmp/list.txt
ele funcionou como esperado. Deve ter havido um atraso entre a hora em que o arquivo foi criado e a hora em que foi escrito, ou algo parecido.
Meu código final:
while [ ! -f /tmp/list.txt ];
do
sleep 1;
done;
sleep 1;
cat /tmp/list.txt;
Espero que isso ajude alguém a economizar meia hora frustrante!
Como @ zane-hooper, tive um problema semelhante no NFS. Em sistemas de arquivos paralelos / distribuídos, o intervalo entre você criar um arquivo em uma máquina e a outra máquina "vê-lo" pode ser muito grande, então eu poderia esperar até um minuto inteiro após a criação do arquivo antes que o loop while saia (e também há um efeito colateral de "ver" um arquivo já excluído).
Isso cria a ilusão de que o script "não funciona" , embora, na verdade, seja o sistema de arquivos que está perdendo o controle.
Demorei um pouco para descobrir, espero que poupe algum tempo.
PS Isso também causa um número irritante de erros de "Manipulador de arquivo obsoleto".
funciona com bash e sh:
touch /tmp/testfile
sleep 10 && rm /tmp/testfile &
until ! [ -f /tmp/testfile ]
do
echo "testfile still exist..."
sleep 1
done
echo "now testfile is deleted.."
Esta é uma versão com um tempo limite para que, após um certo tempo, o loop termine com um erro:
# After 60 seconds the loop will exit
timeout=60
while [ ! -f /tmp/list.txt ];
do
# When the timeout is equal to zero, show an error and leave the loop.
if [ "$timeout" == 0 ]; then
echo "ERROR: Timeout while waiting for the file /tmp/list.txt."
exit 1
fi
sleep 1
# Decrease the timeout of one
((timeout--))
done
faça isso deste modo
while true
do
[ -f /tmp/list.txt ] && break
sleep 2
done
ls -l /tmp/list.txt