while循环测试bash中是否存在文件

Zen*_*net 83 bash shell

我正在研究一个shell文件,它只对txt文件进行某些更改,但是这个测试循环不起作用,我想知道为什么?谢谢!

while [ ! -f /tmp/list.txt ] ;
do
      sleep 2
done
Run Code Online (Sandbox Code Playgroud)

CWF*_*CWF 126

当你说"不起作用"时,你怎么知道它不起作用?

您可以尝试通过添加以下内容来确定文件是否实际存在:

while [ ! -f /tmp/list.txt ]
do
  sleep 2 # or less like 0.2
done
ls -l /tmp/list.txt
Run Code Online (Sandbox Code Playgroud)

您也可以通过键入"echo $ SHELL"来确保使用Bash(或相关)shell.我认为CSH和TCSH对这个循环使用略有不同的语义.

  • @valentt没有hew循环说字面意思是"当NOT文件存在时会睡觉"..如果你要删除'NOT'循环会立即中断 (2认同)
  • 在1行中:`while [!-f /tmp/list.txt]; 睡2 完成 ls -l / tmp / list.txt` (2认同)

yin*_*ted 53

如果安装了inotify-tools,则可以执行以下操作:

file=/tmp/list.txt
while [ ! -f "$file" ]
do
    inotifywait -qqt 2 -e create -e moved_to "$(dirname $file)"
done
Run Code Online (Sandbox Code Playgroud)

这减少了睡眠引起的延迟,同时仍然每2秒检查一次.如果您预计需要它们,可以添加更多事件.

  • 这是一个非常方便的工具.对于任何想知道为什么循环的人来说,它是为了处理创建和等待之间可能的竞争条件,因为inotifywait有`--exclude`来过滤掉文件名,而不是`--include`来忽略所有_except_文件名.上面的命令应该使用`-qq`参数而不是`>&/ dev/null`. (7认同)
  • +1效率.与睡眠共存是丑陋的.对于那些不知道inotifywait的人 - 它是在包inotify-tools中. (4认同)