gpt4 book ai didi

bash - 等待在 Bash 中创建文件

转载 作者:行者123 更新时间:2023-11-29 08:59:09 27 4
gpt4 key购买 nike

我需要创建一个 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:"

最佳答案

这里的问题在于测试,而不是 sleep (正如最初假设的问题)。最小的修复可能如下所示:

while ! test -f "/tmp/$1"; do
sleep 10
echo "Still waiting"
done

请记住 while 循环的语法:

while: while COMMANDS; do COMMANDS; done
Expand and execute COMMANDS as long as the final command in the
`while' COMMANDS has an exit status of zero.

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

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

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


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

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 的接口(interface)的好处是它会在文件系统更改时立即返回,并且不会产生轮询开销(如果它阻止系统休眠,这可能会特别重要)。


顺便说一下练习笔记:

  • 在文件名中引用扩展(即 "/tmp/$1")可防止带有空格或通配符的名称被扩展为多个不同的参数。
  • 在旨在记录人类消费的echo 命令上使用>&2 使stderr 可用于编程消费
  • let 用于数学,而不是通用任务。如果你想使用 "$file",这没什么问题——但赋值应该只是 file=$1,前面没有 let.

关于bash - 等待在 Bash 中创建文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40047801/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com