我正在尝试创建一个脚本来监视目录中的HTML模板文件,当它通知更改时,它会编译模板。我不能让它工作,这就是我得到的:
#!/bin/sh
while FILENAME=$(inotifywait --format %w -r templates/*.html)
do
COMPILED_FILE=$(echo "$FILENAME" | sed s/templates/templates\\/compiled/g | sed s/.html/.js/g)
handlebars $FILENAME -f $COMPILED_FILE -a
done
我使用inotifywait来观看当前目录,尽管我也想要检查子目录。然后,编译后的文件需要保存在名为templates/compiled
的子目录中,并可选择子目录。
所以templates/foo.html
需要编译并存储为templates/compiled/foo.js
所以templates/other/foo.html
需要编译并存储为templates/compiled/other/foo.js
正如您所见,我尝试观看了直播,并将templates/
名称替换为templates/compiled
。
欢迎任何帮助!
答案 0 :(得分:1)
一些观察,然后是一个解决方案:
传递参数-r templates/*.html
仅匹配templates/
中的 .html 文件 - 而不是templates/other/
。相反,我们会-r templates
通知我们templates
下任何文件 的更改。
如果您未在inotifywait
模式下使用--monitor
,则会遗漏在handlebars
正在运行的短暂时间内更改的所有文件(如果您保存所有文件,则可能会发生这种情况你一次打开文件)。最好做这样的事情:
#!/bin/bash
watched_dir="templates"
while read -r dirname events filename; do
printf 'File modified: %s\n' "$dirname$filename"
done < <(inotifywait --monitor --event CLOSE_WRITE --recursive "$watched_dir")
然后,至于转换路径,您可以执行以下操作:
$ dirname=templates/other/
$ echo "${dirname#*/}"
other/
$ echo "$watched_dir/compiled/${dirname#*/}"
templates/compiled/other/
$ filename=foo.html
$ echo "${filename%.html}"
foo
$ echo "${filename%.html}.js"
foo.js
$ echo "$watched_dir/compiled/${dirname#*/}${filename%.html}.js"
templates/compiled/other/foo.js
请注意,我们可以使用Bash's builtin parameter expansion - 无需sed
。
总而言之,我们得到:
#!/bin/bash
watched_dir="templates"
while read -r dirname events filename; do
[[ "${filename##*.}" != 'html' ]] && continue
output_path="$watched_dir/compiled/${dirname#*/}${filename%.html}.js"
handlebars "$dirname$filename" -f "$output_path" -a
done < <(inotifywait --monitor --event CLOSE_WRITE --recursive "$watched_dir")