等待在Bash中创建文件

我需要创建一个bash脚本来等待创建文件.该脚本将在while循环中使用sleep命令,每10秒定期检查一个文件.等待时打印留言.创建文件显示文件内容.以下是我试图实现的内容,但显然无效.在这一点上,我不完全确定如何继续.
#!/bin/bash
let file=$1

while '( -f !  /tmp/$1)'
do
       sleep 10
       echo "still waiting"
done

echo "Content of the file $1:"
这里的问题是测试,而不是睡眠(正如假设的原始问题).可能的最小修复可能如下所示:
while ! test -f "/tmp/$1"; do
  sleep 10
  echo "Still waiting"
done

请记住while循环的语法:

06001

也就是说,扩展循环的第一个参数是一个命令;它需要遵循与任何其他shell命令相同的语法规则.

-f作为测试参数有效 – 一个命令也可以在名称[,需要一个]作为该名称中使用的最后一个参数时访问 – 但它本身并不作为命令有效 – 并且当作为字符串的一部分传递时,它甚至不是可以被解析为单个命令名或参数的shell字.

当您在命令内运行'( – f!/ tmp / $1)’作为命令时,shell正在查找具有该名称的实际命令(包括空格).您可能在PATH中没有名为’/usr/bin /( – f!/ tmp / $1)’的文件或找到该名称的任何其他命令,因此它总是会失败 – 立即退出while循环.

顺便说一句 – 如果您愿意使您的代码特定于操作系统,那么除了使用sleep等待文件存在之外,还有其他方法.例如,从inotify-tools包中考虑inotifywait:

while ! test -f "/tmp/$1"; do
  echo "waiting for a change to the contents of /tmp" >&2
  inotifywait --timeout 10 --event create /tmp >/dev/null || {
    (( $? == 2 )) && continue  ## inotify exit status 2 means timeout expired
    echo "unable to sleep with inotifywait; doing unconditional 10-second loop" >&2
    sleep 10
  }
done

基于inotify的接口的好处是它在文件系统更改时立即返回,并且不会产生轮询开销(如果它阻止系统休眠,这可能会特别重要).

顺便说一下,一些练习笔记:

>引用文件名中的扩展(即“/ tmp / $1”)可防止带有空格或通配符的名称扩展为多个不同的参数.>在echo命令上使用>& 2来记录人类消费,使得stderr可用于程序化消费> let用于数学,而不是通用作业.如果你想使用“$file”,那没什么不对 – 但是赋值应该只是file = $1,没有先前的let.

相关文章

普通模式 >G 增加当前行到文档末尾处的缩紧层级 $ 移动到本行的末尾 . 相当于一个...
原文连接: https://spacevim.org/cn/layers/lang/elixir/ 模块简介 功能特性 启用模块 快捷键 语言专属...
原文连接: https://spacevim.org/cn/layers/lang/dart/ 模块简介 功能特性 依赖安装及启用模块 启用模...
 =   赋值操作符,可以用于算术和字符串赋值 +        加法计算     -        减法运算...
1.根据包名来查看指定的APP指定数据 adb shell "top | grep com.xxx.xxx" 由于这样打印出来的数...
ctrl+F 向下翻页 ctrl+B 向下翻页 u 取消最近一次操作 U 取消当前行的操作 ZZ 保存当前内容并退出 gg 跳...