Пока цикл проверяет, существует ли файл в bash

Я работаю над оболочкой script, которая делает определенные изменения в txt файле только в том случае, если она существует, но этот тестовый цикл не работает, интересно, почему? Спасибо!

while [ ! -f /tmp/list.txt ] ;
do
      sleep 2
done

Ответ 1

Когда вы говорите "не работает", откуда вы знаете, что он не работает?

Вы можете попытаться выяснить, существует ли файл, добавив:

while [ ! -f /tmp/list.txt ]
do
  sleep 2
done
ls -l /tmp/list.txt

Вы также можете убедиться, что используете Bash (или родственную) оболочку, набрав 'echo $SHELL'. Я думаю, что CSH и TCSH используют немного другую семантику для этого цикла.

Ответ 2

Если у вас установлены инструменты inotify, вы можете сделать это:

file=/tmp/list.txt
while [ ! -f "$file" ]
do
    inotifywait -qqt 2 -e create -e moved_to "$(dirname $file)"
done

Это уменьшает задержку, вызванную сном, все еще проверяя каждые 2 секунды. Вы можете добавить больше событий, если будете ожидать, что они понадобятся.

Ответ 3

У меня была та же проблема, поставил! вне скобок;

while ! [ -f /tmp/list.txt ];
do
    echo "#"
    sleep 1
done

Кроме того, если вы добавите эхо внутри цикла, он скажет вам, попадаете ли вы в цикл или нет.

Ответ 4

Я столкнулся с подобной проблемой, и это привело меня сюда, поэтому я просто хотел оставить свое решение для тех, кто испытывает то же самое.

Я обнаружил, что если я запустил cat /tmp/list.txt, файл был бы пустым, хотя я был уверен, что в файл сразу помещается содержимое. Оказывается, если я положил sleep 1; непосредственно перед cat /tmp/list.txt, он работал, как ожидалось. Должна была быть задержка между временем создания файла и временем его написания или что-то в этом направлении.

Мой последний код:

while [ ! -f /tmp/list.txt ];
do
    sleep 1;
done;
sleep 1;
cat /tmp/list.txt;

Надеюсь, это поможет спасти кого-то разочаровывающий полчаса!

Ответ 5

сделайте это так

while true
do
  [ -f /tmp/list.txt ] && break
  sleep 2
done
ls -l /tmp/list.txt