我正在开发一个shell脚本,该脚本仅在txt文件确实存在的情况下对其进行某些更改,但是此测试循环不起作用,我想知道为什么吗?谢谢!
while [ ! -f /tmp/list.txt ] ;
do
sleep 2
done
我正在开发一个shell脚本,该脚本仅在txt文件确实存在的情况下对其进行某些更改,但是此测试循环不起作用,我想知道为什么吗?谢谢!
while [ ! -f /tmp/list.txt ] ;
do
sleep 2
done
Answers:
当您说“无效”时,您怎么知道它无效?
您可以尝试通过添加以下内容来确定文件是否实际存在:
while [ ! -f /tmp/list.txt ]
do
sleep 2 # or less like 0.2
done
ls -l /tmp/list.txt
您还可以通过键入“ echo $ SHELL”来确保您正在使用Bash(或相关)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
这减少了睡眠带来的延迟,同时仍每隔“ x”秒轮询一次。如果您预计需要它们,则可以添加更多事件。
--exclude
过滤掉文件名,而不是--include
忽略文件名以外的所有内容。上面的命令应该使用-qq
参数,而不是>&/dev/null
。
--timeout
,不是检查频率,不是吗?inotifywait的要点是没有轮询
inotifywait
如果在开始监听事件之前创建了文件,则可能会无限期挂起。
我遇到了一个类似的问题,它把我引到了这里,所以我只想将我的解决方案留给任何遇到同样问题的人。
我发现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;
希望这可以帮助您节省一个令人沮丧的半小时!
适用于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