如何在文件更改时执行 shell 脚本?

How to execute a shell script when a file changes?

在我的目录中,我有一个名为 test.txt 的文本文件和一个名为 targetscript.sh.

的 shell 脚本

我想在 test.file 上发生任何更改时 运行 这个 shell 脚本。在我的服务器上,我没有安装新工具的选项,例如 inotfy 或类似的东西。

所以经过一番研究后,我编写了以下 shell 脚本,它将采用 test.txt 的时间戳,如果发生任何更改,它将触发 targetscript.sh.

#!/bin/bash
while true
do
    ATIME=$(stat -c %Z /home/haider/test.txt)
    if [[ "$ATIME" != "$LTIME" ]]; then
        echo "RUN COMMNAD"
        ./targetscript.sh
        LTIME=$ATIME
    fi
    sleep 5
done

但是我收到以下错误。

首先,[[1617030570: command not found错误是由于[[后面缺少space造成的(问题中没有显示

其次,由于未设置 LTIME,因此在第一次迭代时您将始终 运行 ./targetscript.sh。因此 "$ATIME" != "$LTIME" 会失败,sh 脚本会被执行。

考虑在 while 循环之前设置 $LTIME

#!/bin/bash
LTIME=$(stat -c %Z /private/tmp/jq/tst.txt)
while true
do
  ATIME=$(stat -c %Z /private/tmp/jq/tst.txt)
  if [[ "$ATIME" != "$LTIME" ]]; then
        echo "RUN COMMNAD"
        ./targetscript.sh
        LTIME=$ATIME
  fi
  sleep 2
done

我想你可以试试 entr 命令。默认情况下,此命令不在 mac 上,如果您使用 mac,则需要通过 homebrew 安装它。

brew install entr

如果您使用的是Linux,您可以通过apt-get安装。

sudo apt-get install entr

如何使用entr?

您首先列出您正在观看的文件,然后将列表传送到 entr 命令中。基本上,如果你有一个 example.txt 文件并且你想监视它并在它发生更改时执行命令,请使用此命令。

ls example.txt | entr echo "watching..."

另一个基本用法是您首先定义 bash 脚本并使其可执行,然后 运行 这个命令。

find . -type f | entr "./run.sh"

find . -type f returns 当前目录中递归的文件列表。然后将结果通过管道输入 entr 命令,执行脚本 run.sh.