Bash&(graphviz)点输出重定向

Bash&(graphviz)点输出重定向,bash,graphviz,dot,Bash,Graphviz,Dot,我是一个Bash新手,每当目标文件发生更改时,我都会努力让dot命令自动运行。我希望在文件查看器中打开输出.png,并在.dot文件保存时更新图像 我尝试了一个单行程序,但没有效果。我认为存在缓冲问题,因此没有输出?: inotifywait -m --timefmt '%H:%M' --format '%T %w %e %f' -e close_write . | awk '{print $4}' | dot $1 -Tpng -o foo.png 转到基本Bash脚本,我尝试了: #!/b

我是一个Bash新手,每当目标文件发生更改时,我都会努力让dot命令自动运行。我希望在文件查看器中打开输出.png,并在.dot文件保存时更新图像

我尝试了一个单行程序,但没有效果。我认为存在缓冲问题,因此没有输出?:

inotifywait -m --timefmt '%H:%M' --format '%T %w %e %f' -e close_write . |
awk '{print $4}' | dot $1 -Tpng -o foo.png
转到基本Bash脚本,我尝试了:

#!/bin/sh
MONITORDIR="./foo.dot"
inotifywait -m --timefmt '%H:%M' --format '%T %w %e %f' -e close_write "${MONITORDIR}" | while read TIME DIR EVENT FILE
do
    echo $FILE;
    dot -Tpng ${FILE} -o 'foo.png';
done
但是,根据-o标志的使用与最多2>&1*的重定向,会出现各种问题。通常,输出文件为空。我宁愿避免深入巴什兰,但是:我应该做些什么不同的事情呢?这不是一件小事吗


*例如,“16”附近的第1行中出现Warning::syntax错误,Etan的注释导致出现工作版本:

#!/bin/sh
MONITORDIR="./foo.dot"
inotifywait -m --timefmt '%H:%M' --format '%T %w %e %f' -e close_write "${MONITORDIR}" | while read TIME DIR EVENT FILENAME
do
    echo $TIME;
    echo $DIR;
    echo $EVENT;
    echo $FILENAME;
    dot -Tpng $DIR -o 'foo.png';
done
值得注意的是,bare watch语句中有4个位置参数,但bash看到的变量不同:

me@comp:~/Projects/inotifytest$ inotifywait -m --timefmt '%H:%M' --format '%T %w %e %f' -e close_write .
Setting up watches.
Watches established.
17:23 ./ CLOSE_WRITE,CLOSE foo.dot
vs


编辑点文件会导致实时图形更新。谢谢大家

管道不设置位置参数。您不能使用$1作为管道输入通过管道发送到命令。是什么给了您这个警告?点你的观众?$FILE是否正确设置了该循环?如果是这样,并且dot命令是正确的,那么while循环应该已经工作了。虽然在处理过程中,dot会截断输出文件,但我不确定。您最好使用一个临时输出文件,然后在dot完成后使用mv替换真正的文件/bin/sh,这是一个POSIX脚本,不是bash脚本。Bash脚本开始于/bin/bash.Aside:所有大写变量名都是保留的——请参阅POSIX规范的第四段,记住shell变量和环境变量共享一个名称空间;您自己的变量名称中应至少包含一个小写字符,以避免与对shell或操作系统有意义的变量发生冲突。旁白:对包含空格/元字符的每个文本和每个扩展双引号:$var、$command$var、${array[@]}、a&b。对代码或文字$使用“单引号”:“成本$5 US”,ssh主机“echo$HOSTNAME”。看,还有。
me@comp:~/Projects/inotifytest$ sh dotwatch.sh
Setting up watches.
Watches established.
17:22
./foo.dot
CLOSE_WRITE,CLOSE
<Intentionally blank>