2016-01-21 2 views
1

Я новичок Bash, пытающийся получить автоматическое управление командой точки при изменении целевого файла. Я хотел бы, чтобы выход .png был открыт в средстве просмотра файлов и обновил изображение на .dot файле save.Bash & (graphviz) dot output redirection

Я попробовал одну гильзу без толку (я думаю, что проблема буферизация, при этом не выход?):

inotifywait -m --timefmt '%H:%M' --format '%T %w %e %f' -e close_write . | 
awk '{print $4}' | dot $1 -Tpng -o foo.png 

Moving к основной Баш скрипт, я пытался:

#!/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) *. Обычно выходной файл был пустым. Я бы предпочел избегать погружений в глубь страны, но: что я должен делать по-другому? Разве это не должно быть тривиальным?

* Например, Warning: <stdin>: syntax error in line 1 near '16'

+1

Трубопроводы не устанавливают позиционные аргументы. Вы не можете подключиться к команде, используя '$ 1' для ввода конвейера. –

+1

Что дало вам это предупреждение? 'Dot'? Ваш зритель? Правильно ли был задан '$ FILE' с этим циклом? Если это так, и эта команда 'dot' верна, то цикл' while' должен работать. Хотя когда в процессе обработки 'dot' будет усекать выходной файл, я не уверен. Возможно, вам лучше использовать временный выходной файл, а затем использовать 'mv' для замены реального файла после завершения' dot'. –

+1

Кроме того: если он начинается с '#!/Bin/sh', это скрипт POSIX sh, а не сценарий bash. Сценарии Bash начинаются с '#!/Bin/bash'. –

ответ

1

комментарии Этанов привели к рабочей версии:

#!/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 

Следует отметить, что существует 4 позиционных аргументы от голого заявления часов, но переменные Баш видит различны:

[email protected]:~/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 

против

[email protected]:~/Projects/inotifytest$ sh dotwatch.sh 
Setting up watches. 
Watches established. 
17:22 
./foo.dot 
CLOSE_WRITE,CLOSE 
<Intentionally blank> 

Редактирование файла dotfile при обновлении графика в реальном времени. Всем спасибо!

+2

Кроме того, зарезервированы имена всех верхних регистров - см. Четвертый абзац спецификации POSIX по адресу http://pubs.opengroup.org/onlinepubs/009695399/basedefs/xbd_chap08.html, имея в виду, что переменные оболочки и переменные среды совместно используют Пространство имен; ваши собственные переменные должны иметь по крайней мере один строчный символ в своих именах, чтобы избежать конфликта с переменными со значением для вашей оболочки или операционной системы. –

+1

Кроме того: «Двойная кавычка» каждого литерала, содержащего пробелы/метасимволы и _every_ расширения: «$ var», «$ (команда« $ var »)», «$ {array [@]}», «a & b». Используйте «одинарные кавычки» для кода или литерала $: «Затраты $ 5 US ', ssh host' echo" $ HOSTNAME "'. См. Http://mywiki.wooledge.org/Quotes, http://mywiki.wooledge.org/Arguments и http://wiki.bash-hackers.org/syntax/words. –