Я работаю над оболочкой script, которая делает определенные изменения в txt файле только в том случае, если она существует, но этот тестовый цикл не работает, интересно, почему? Спасибо!
while [ ! -f /tmp/list.txt ] ;
do
sleep 2
done
Я работаю над оболочкой script, которая делает определенные изменения в txt файле только в том случае, если она существует, но этот тестовый цикл не работает, интересно, почему? Спасибо!
while [ ! -f /tmp/list.txt ] ;
do
sleep 2
done
Когда вы говорите "не работает", откуда вы знаете, что он не работает?
Вы можете попытаться выяснить, существует ли файл, добавив:
while [ ! -f /tmp/list.txt ]
do
sleep 2
done
ls -l /tmp/list.txt
Вы также можете убедиться, что используете Bash (или родственную) оболочку, набрав 'echo $SHELL'. Я думаю, что CSH и TCSH используют немного другую семантику для этого цикла.
Если у вас установлены инструменты inotify, вы можете сделать это:
file=/tmp/list.txt
while [ ! -f "$file" ]
do
inotifywait -qqt 2 -e create -e moved_to "$(dirname $file)"
done
Это уменьшает задержку, вызванную сном, все еще проверяя каждые 2 секунды. Вы можете добавить больше событий, если будете ожидать, что они понадобятся.
У меня была та же проблема, поставил! вне скобок;
while ! [ -f /tmp/list.txt ];
do
echo "#"
sleep 1
done
Кроме того, если вы добавите эхо внутри цикла, он скажет вам, попадаете ли вы в цикл или нет.
Я столкнулся с подобной проблемой, и это привело меня сюда, поэтому я просто хотел оставить свое решение для тех, кто испытывает то же самое.
Я обнаружил, что если я запустил 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;
Надеюсь, это поможет спасти кого-то разочаровывающий полчаса!
сделайте это так
while true
do
[ -f /tmp/list.txt ] && break
sleep 2
done
ls -l /tmp/list.txt