Цикл while для проверки наличия файла в bash - PullRequest
72 голосов
/ 04 марта 2010

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

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

Ответы [ 6 ]

110 голосов
/ 04 марта 2010

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

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

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

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

51 голосов
/ 06 августа 2011

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

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

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

4 голосов
/ 11 января 2016

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

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

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

2 голосов
/ 16 сентября 2014

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

Я обнаружил, что если бы я запустил 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;

Надеюсь, это поможет кому-то сэкономить полчаса разочарования!

1 голос
/ 13 февраля 2018

Как и у @ zane-hooper, у меня была похожая проблема в NFS. В параллельных / распределенных файловых системах разрыв между созданием файла на одной машине и другой машиной, «видящей» его, может быть очень большим, поэтому я могу подождать до полной минуты после создания файла до выхода из цикла while (и также есть следствие того, что он «видит» уже удаленный файл).

Это создает иллюзию, что скрипт "не работает" , в то время как на самом деле это файловая система, которая сбрасывает мяч.

Мне потребовалось некоторое время, чтобы понять, надеюсь, это сэкономит кому-то время.

PS Это также вызывает раздражающее количество ошибок «Stale file handler».

0 голосов
/ 04 марта 2010

сделай так

while true
do
  [ -f /tmp/list.txt ] && break
  sleep 2
done
ls -l /tmp/list.txt
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...