Я працюю над сценарієм оболонки, який робить певні зміни у файлі txt, лише якщо він існує, проте цей цикл тесту не працює, цікаво, чому? Дякую!
while [ ! -f /tmp/list.txt ] ;
do
sleep 2
done
Я працюю над сценарієм оболонки, який робить певні зміни у файлі txt, лише якщо він існує, проте цей цикл тесту не працює, цікаво, чому? Дякую!
while [ ! -f /tmp/list.txt ] ;
do
sleep 2
done
Відповіді:
Коли ви говорите "не працює", звідки ви знаєте, що це не працює?
Ви можете спробувати з’ясувати, чи файл насправді існує, додавши:
while [ ! -f /tmp/list.txt ]
do
sleep 2 # or less like 0.2
done
ls -l /tmp/list.txt
Ви також можете переконатися, що використовуєте оболонку Bash (або пов'язану з нею), набравши 'echo $ SHELL'. Я думаю, що CSH та TCSH використовують дещо іншу семантику для цього циклу.
while [ ! -f /tmp/list.txt ]; do sleep 2; done; ls -l /tmp/list.txt
Якщо ви працюєте на Linux і встановили inotify-tools, ви можете зробити це:
file=/tmp/list.txt
while [ ! -f "$file" ]
do
inotifywait -qqt 2 -e create -e moved_to "$(dirname $file)"
done
Це зменшує затримку, спричинену сном, одночасно опитуючи кожні "х" секунд. Ви можете додати більше подій, якщо передбачаєте, що вони потрібні.
--excludeповинен відфільтрувати імена файлів, але не --includeігнорувати все, крім імені файлу. Вищезазначена команда повинна використовувати -qqаргумент, а не >&/dev/nullхоча.
--timeout не частота перевірки, ні? Сенс inotifywait полягає в тому, що немає опитування
inotifywaitможе зависати необмежений час, якщо файл створюється безпосередньо перед тим, як він починає прослуховувати події.
У мене була та ж проблема, покладіть! поза дужками;
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;
Сподіваюся, це допоможе врятувати когось неприємних півгодини!
Як і @ zane-hooper, у мене була подібна проблема на NFS. У паралельних / розподілених файлових системах затримка між створенням файлу на одній машині та іншою машиною, коли вона "бачить", може бути дуже великою, тому я міг би зачекати до цілої хвилини після створення файлу до виходу циклу while (і також є наслідком "побачення" вже видаленого файлу).
Це створює ілюзію, що сценарій "не працює" , хоча насправді саме файлова система скидає кульку.
Це зайняло деякий час, щоб зрозуміти, сподіваюся, це заощадить комусь час.
PS Це також викликає неприємну кількість помилок "Обробник застарілих файлів".
працює з bash і sh:
touch /tmp/testfile
sleep 10 && rm /tmp/testfile &
until ! [ -f /tmp/testfile ]
do
echo "testfile still exist..."
sleep 1
done
echo "now testfile is deleted.."
Ось версія з часом очікування, щоб через певний час цикл закінчувався помилкою:
# After 60 seconds the loop will exit
timeout=60
while [ ! -f /tmp/list.txt ];
do
# When the timeout is equal to zero, show an error and leave the loop.
if [ "$timeout" == 0 ]; then
echo "ERROR: Timeout while waiting for the file /tmp/list.txt."
exit 1
fi
sleep 1
# Decrease the timeout of one
((timeout--))
done
робити це так
while true
do
[ -f /tmp/list.txt ] && break
sleep 2
done
ls -l /tmp/list.txt