用于监视HTML模板并使用Handlebars编译的Shell脚本

时间:2014-02-06 12:58:46

标签: bash shell templates compilation handlebars.js

我正在尝试创建一个脚本来监视目录中的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

欢迎任何帮助!

1 个答案:

答案 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")