3

Я пытаюсь, чтобы скрипт нашел файл в /tmp с именем sleep.txt, но вместо этого он продолжает цикл

Вот что у меня есть:

#!/bin/sh

set -x
until [ $(ls -la | grep -w "sleep.txt" | wc -l) != 0 ];
do
        echo "Sleep.txt doesn't exist as of yet..."
done
        echo "Sleep.txt now exists!!!"
        sleep 2
exit

2 ответа2

8

Этот скрипт не использует опрос. Другими словами, он не делает периодических проверок. Вместо этого он использует инструмент inotifywait , предназначенный для отслеживания изменений в файловой системе.

В этом сценарии inotifywait отслеживает текущий каталог (.). Каждый раз, когда файл создается в этом каталоге, inotifywait выдает его имя, и скрипт проверяет, соответствует ли он sleep.txt . Если это так, он объявляет о создании:

[ -e sleep.txt ] || while IFS= read -r fname
do_
    [ "$fname" = sleep.txt ] && break
done < <(inotifywait -m -q -e create -e moved_to --format %f .)

echo "Finally, sleep.txt now exists!!!"

Подробнее

Опции, используемые для inotifywait имеют следующие значения:

  • -m означает следить за каталогом. Другими словами, не останавливайтесь в первый раз, когда что-то происходит, о чем стоит рассказать.

  • -q означает быть спокойнее, чем обычно.

  • -e create -e moved_to означает только отчет о файле, созданном или перемещенном в этот каталог.

  • --format %f говорит ему печатать имя файла каждый раз, когда происходит событие создания файла

  • . говорит, что каталог для мониторинга. Период . , всегда означает текущий каталог.

Установка inotifywait

В Debian-подобных системах inotifywait является частью inotify-tools и может быть установлен через:

apt-get install inotify-tools

MS Windows и OSX

inotifywait доступен для систем Linux, а также работает под управлением Cygwin.

Чтобы прочитать о похожих инструментах для Windows, нажмите здесь.

Для получения информации о похожих инструментах для Mac OSX, нажмите здесь.

6

Разбор ls не очень хорошая идея.

Вместо этого вы можете использовать тест -e чтобы проверить, существует ли файл:

#!/bin/sh

until [ -e sleep.txt ]; do
    echo "sleep.txt doesn't exist as of yet..."
    sleep 1
done

echo "sleep.txt now exists!!!"
sleep 2

Обратитесь к man test для получения дополнительной информации о команде test .

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .