我提供这个答案是为了说明一个类似但更复杂的用例。请注意,@Oli 提供的代码包含在我的答案中。
我想在文件更改时发布处理文件。具体来说,我想在文件上调用 dart-sassscss
以生成css
文件及其映射文件。然后css
文件被压缩。
我的问题是scss
可以直接通过 vim(在写入文件时使用备份副本)或通过 SFTP(特别是使用 macOS Transmit)来编辑/保存源文件。这意味着可以将更改inotifywait
视为一对或单个(由于我认为是通过 SFTP 的CREATE
cmd )。因此,如果我看到 a或 a后面没有任何东西,我必须启动处理。CLOSE_WRITE,CLOSE
CREATE
RENAME
CLOSE_WRITE,CLOSE
CREATE
评论:
- 它必须处理多个并发编辑/保存。
- 表格传输使用的临时文件
<filename>_safe_save_<digits>.scss
不得考虑。
- 的版本
inotify-tools
是 3.20.2.2 并且已经从源代码编译(没有包管理器)以获得带有include
选项的最新版本。
#!/usr/bin/bash
declare -A pids
# $1: full path to source file (src_file_full)
# $2: full path to target file (dst_file_full)
function launch_dart() {
echo "dart"
/opt/dart-sass/sass "$1" "$2" && /usr/bin/gzip -9 -f -k "$2"
}
inotifywait -e close_write,create --include "\.scss$" -mr assets/css |
grep -v -P '(?:\w+)_safe_save_(?:\d+)\.scss$' --line-buffered |
while read dir action file; do
src_file_full="$dir$file"
dst_dir="${dir%assets/css/}"
dst_file="${file%.scss}.css"
dst_file_full="priv/static/css/${dst_dir%/}${dst_file}"
echo "'$action' on file '$file' in directory '$dir' ('$src_file_full')"
echo "dst_dir='$dst_dir', dst_file='$dst_file', dst_file_full='$dst_file_full'"
# if [ "$action" == "DELETE" ]; then
# rm -f "$dst_file_full" "${dst_file_full}.gz" "${dst_file_full}.map"
if [ "$action" == "CREATE" ]; then
echo "create. file size: " $(stat -c%s "$src_file_full")
{ sleep 1; pids[$src_file_full]=0; launch_dart "$src_file_full" "$dst_file_full"; } & pids[$src_file_full]=$!
elif [ "$action" == "CLOSE_WRITE,CLOSE" ]; then
[[ ${pids[$src_file_full]} -gt 0 ]] && kill -9 ${pids[$src_file_full]}
launch_dart "$src_file_full" "$dst_file_full"
fi
done