Je travaille sur un script shell qui effectue certaines modifications sur un fichier txt uniquement s'il existe, mais cette boucle de test ne fonctionne pas, je me demande pourquoi? Je vous remercie!
while [ ! -f /tmp/list.txt ] ;
do
sleep 2
done
Réponses:
Quand vous dites "ne fonctionne pas", comment savez-vous que cela ne fonctionne pas?
Vous pouvez essayer de déterminer si le fichier existe réellement en ajoutant:
Vous pouvez également vous assurer que vous utilisez un shell Bash (ou associé) en tapant «echo $ SHELL». Je pense que CSH et TCSH utilisent une sémantique légèrement différente pour cette boucle.
la source
while [ ! -f /tmp/list.txt ]; do sleep 2; done; ls -l /tmp/list.txt
Si vous êtes sous Linux et avez installé inotify-tools, vous pouvez le faire:
Cela réduit le délai introduit par le sommeil tout en continuant d'interroger toutes les "x" secondes. Vous pouvez ajouter d'autres événements si vous prévoyez qu'ils sont nécessaires.
la source
--exclude
filtrer les noms de fichiers, mais pas--include
tout ignorer sauf le nom de fichier. La commande ci-dessus devrait utiliser l'-qq
argument au lieu de>&/dev/null
cependant.--timeout
, pas la fréquence de vérification, non? Le point d'inotifywait est qu'il n'y a pas de sondageinotifywait
pourrait se bloquer indéfiniment si un fichier est créé juste avant de commencer à écouter les événements.J'ai eu le même problème, mettez le! en dehors des crochets;
De plus, si vous ajoutez un écho à l'intérieur de la boucle, il vous dira si vous entrez dans la boucle ou non.
la source
J'ai rencontré un problème similaire et cela m'a conduit ici, alors je voulais juste laisser ma solution à tous ceux qui vivent la même chose.
J'ai trouvé que si j'exécutais
cat /tmp/list.txt
le fichier serait vide, même si j'étais certain que le contenu était placé immédiatement dans le fichier. Il s'avère que si je mets unsleep 1;
juste avant lecat /tmp/list.txt
cela a fonctionné comme prévu. Il doit y avoir eu un délai entre le moment où le fichier a été créé et le moment où il a été écrit, ou quelque chose du genre.Mon code final:
J'espère que cela aidera quelqu'un à gagner une demi-heure frustrante!
la source
Comme @ zane-hooper, j'ai eu un problème similaire sur NFS. Sur les systèmes de fichiers parallèles / distribués, le décalage entre la création d'un fichier sur une machine et la "visualisation" de l'autre machine peut être très important, donc je pourrais attendre jusqu'à une minute complète après la création du fichier avant que la boucle while se termine (et il y a aussi une séquelle de "voir" un fichier déjà supprimé).
Cela crée l'illusion que le script "ne fonctionne pas" , alors qu'en fait c'est le système de fichiers qui lâche la balle.
Cela m'a pris un certain temps à comprendre, j'espère que cela fera gagner du temps à quelqu'un.
PS Cela provoque également un nombre ennuyeux d'erreurs "Stale file handler".
la source
fonctionne avec bash et sh à la fois:
la source
Voici une version avec un timeout pour qu'après un certain temps la boucle se termine par une erreur:
la source
fais-le comme ça
la source