Я пытаюсь создать сценарий, который будет что-то делать при изменении файла. Это сработает, если я запущу наблюдатель в другом терминале и отредактирую файл в другом экземпляре vim.
Однако я хочу, чтобы сценарий открывал экземпляр vim, а затем запускал наблюдатель, чтобы он что-то делал, когда я сохраняю файл.
Это мой сценарий, run.sh:
#!/usr/bin/env bash
vim chart.csv
inotifywait --quiet --recursive --monitor --event modify chart.csv | while read; do
notify-send "hi, world"
done





Если у вас есть gnome-терминал, то
#!/usr/bin/env bash
gnome-terminal -e "vim chart.csv"
# Or xterm -e vim chart.csv &
inotifywait --quiet --recursive --monitor --event modify chart.csv | while read; do
notify-send "hi, world"
done
Обновлять
Если вы хотите завершить процесс, когда vim завершится, попробуйте следующее:
#!/usr/bin/env bash
urxvt -e bash -c "vim chart.csv; kill $$"
inotifywait --quiet --recursive --monitor --event modify chart.csv | while read; do
notify-send "hi, world"
done
Хорошо! Я хотел бы запустить его в той же оболочке, так как сначала я захожу в папку для выполнения скрипта. Возможно ли этого добиться? Я получаю следующую ошибку: stty: 'standard input': Inappropriate ioctl for device.
Да, когда я закрываю его. Сначала я могу прочитать «Vim: Внимание: ввод не с терминала», а когда я закрываю, появляется ошибка «stty».
Для первого сообщения я смог решить этот флаг: «vim --not-a-term». Однако ошибка «stty» более важна, поскольку она зависла, и мне приходится закрыть оболочку. (На самом деле я использую tmux, используя URxvt, поэтому просто закрываю окно tmux).
У меня тоже есть это в .zshrc: stty intr ^j
Вы запустили мой скрипт как есть? Или вы внесли изменения?
Я использую tmux, поэтому хотел бы с ним разобраться. Если нет, я бы использовал urxvt -e, который похож на gnome-terminal -e.
С tmux вы работаете на удаленной машине?
Только на локальной машине.
Что вы думаете об использовании этого? < /dev/tty vim --not-a-term chart.csv &.
Вы пробовали это? Он должен работать.
Да. Все работает нормально, но когда я закрываю файл, мне приходится отменить процесс с помощью Ctrl+c. Там написано: «Часы установлены». в последней строке.
Ваш inotifywait ... | while read ... не зависит от vim. Обычно вам нужно выйти, нажав Ctrl-C.
Да спасибо!
Закрыть процесс, когда этот файл закрыт, возможно ли? Я попробовал с двумя inotifywait, но безуспешно. Примерно так: inotifywait -e close_write adsense.csv | while read; do
Хороший! Сейчас я делаю это с помощью tmux: tmux new-window bash -c "vim chart.csv; kill $$. Когда я закрываю файл, он также закрывает окно tmux, что хорошо, потому что возвращает меня в то же место. Идеальный!
Этот сценарий не обнаружит изменений, потому что
inotifywaitне запустится до тех пор, покаvimне завершится. Вы можете добавить&к командеvim, чтобы она работала в фоновом режиме. Если вы ищете один файл, вам не нужен--recursive.