我正在尝试让脚本在 /tmp 中找到一个名为 sleep.txt 的文件,但它一直在循环
这是我所拥有的:
#!/bin/sh
set -x
until [ $(ls -la | grep -w "sleep.txt" | wc -l) != 0 ];
do
echo "Sleep.txt doesn't exist as of yet..."
done
echo "Sleep.txt now exists!!!"
sleep 2
exit
Run Code Online (Sandbox Code Playgroud)
此脚本不使用轮询。换句话说,它不进行定期检查。相反,它使用一个工具 ,该工具inotifywait旨在监视对文件系统的更改。
在此脚本中,inotifywait监视当前目录 ( .)。每次在该目录中创建文件时,都会inotifywait发出其名称,脚本会检查它是否与sleep.txt. 如果是这样,它会宣布创建:
[ -e sleep.txt ] || while IFS= read -r fname
do_
[ "$fname" = sleep.txt ] && break
done < <(inotifywait -m -q -e create -e moved_to --format %f .)
echo "Finally, sleep.txt now exists!!!"
Run Code Online (Sandbox Code Playgroud)
用于的选项inotifywait具有以下含义:
-m意味着继续监视目录。换句话说,不要在第一次发生值得报告的事情时停下来。
-q 意味着比平时更安静。
-e create -e moved_to 表示仅报告创建或移动到此目录中的文件。
--format %f 告诉它每次发生文件创建事件时打印文件名
.告诉它要监视的目录。句点 ,.始终表示当前目录。
inotifywait在类似 Debian 的系统上,inotifywait是其中的一部分,inotify-tools可以通过以下方式安装:
apt-get install inotify-tools
Run Code Online (Sandbox Code Playgroud)
inotifywait 可用于 Linux 系统,也可在 Cygwin 下运行。
要了解适用于 Windows 的类似工具,请单击此处。
有关适用于 Mac OSX 的类似工具的信息,请单击此处。
解析ls 不是一个好主意。
相反,您可以使用-e测试来检查文件是否存在:
#!/bin/sh
until [ -e sleep.txt ]; do
echo "sleep.txt doesn't exist as of yet..."
sleep 1
done
echo "sleep.txt now exists!!!"
sleep 2
Run Code Online (Sandbox Code Playgroud)
man test有关test命令的更多信息,请咨询。