Я хочу написать wait пока файл не существует в Bash. Как мне это сделать?

Я пробовал это, но это не работает:

while [ ! -f outputs\/$trace\_hist_len_$hist_len\_page_size_$page_size\.out]; do
echo "waiting for outputs\/$trace\_hist_len_$hist_len\_page_size_$page_size\.out";
done

Кажется, есть синтаксическая ошибка.

2 ответа2

8
while : ; do
    [[ -f "/path/to/file" ]] && break
    echo "Pausing until file exists."
    sleep 1
done

Без использования чего-то вроде inotify , это примерно предел того, что вы собираетесь делать.

Петля while выше просто : так как его условие , которое в значительной степени просто означает «сделать это , пока мы не убить его.»

Важная строка - это [[ test. Условный тест здесь не использует оператор if . Это потому, что [[ является действительной командой, а НЕ является частью оператора if . Выполняется [[ -f "/path/to/file" ]] а && проверяет состояние выхода команды [[ и выполняет следующий оператор, если это состояние выхода равно 0 (успех). Следующее утверждение здесь - это break который закроет текущий цикл, в котором находится ваш скрипт.

Примечание: в bash настоятельно рекомендуется использовать [[ вместо [ . Он обладает всеми возможностями [ но гораздо более мощный и простой в использовании.

3

Пробел между аргументом файла и закрывающей скобкой важен.

if [ -f "path" ]; then echo good;fi

if [-f "path"] ; then  echo bad;fi
if [ -f "path"]; then  echo bad;fi
if [-f "path" ]; then  echo bad;fi

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