如何在文件更改时执行 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
.
在我的目录中,我有一个名为 test.txt
的文本文件和一个名为 targetscript.sh
.
我想在 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
.