Для этого я написал программу на Python, которая называется rerun
.
UPDATE: Этот ответ представляет собой Python скрипт, который опрашивает на предмет изменений, что полезно при некоторых обстоятельствах. Для скрипта на Linux-only Bash, который использует inotify, смотрите другой мой ответ, найдите на этой странице ‘rerun2’.
Install for Python2 или Python3 с:
pip install --user rerun
и использование очень простое:
rerun "COMMAND"
Команда ожидается как единственный аргумент, а не как последовательность аргументов, разделенных пробелами. Поэтому процитируйте ее, как показано на рисунке, что уменьшает любое дополнительное экранирование, которое вам придется добавить. Просто напечатайте команду так, как вы напечатали бы в командной строке, но в окружении кавычек.
По умолчанию она просматривает все файлы в текущем каталоге или под ним, пропуская такие вещи, как известные исходники, .git, .svn, и т.д.
Дополнительные флаги включают ‘-i NAME’, который игнорирует изменения в именованных файлах или каталогах. Это может быть задано несколько раз.
Поскольку это скрипт на Python, он должен запустить команду как подпроцесс, и мы используем новый экземпляр текущей оболочки пользователя для интерпретации ‘COMMAND’ и принятия решения о том, какой процесс на самом деле должен быть запущен. Однако, если ваша команда содержит псевдонимы оболочки и т.п., которые определены в .bashrc, они не будут загружены подоболочкой. Чтобы исправить это, вы можете дать флаг ‘-I’ для повторного запуска, чтобы использовать интерактивные (так же известные как ‘вход в систему’) подоболочки. Это медленнее и более подвержено ошибкам, чем запуск обычной оболочки, потому что она должна исходить из вашего .bashrc.
я использую ее с Python 3, но в последний раз я проверял, что перезапуск все еще работает с Python 2.
Double-edged sword - это то, что он использует опрос вместо inotify. С другой стороны, это означает, что он работает на каждой операционной системе. К тому же, это лучше, чем некоторые другие решения, показанные здесь, с точки зрения того, что он запускает данную команду только один раз для множества изменений файловой системы, а не один раз для каждого измененного файла, в то же время он запускает команду второй раз, если какие-либо файлы изменяются снова во время выполнения команды.
С другой стороны, опрос означает, что существует задержка от 0.0 до 1.0 секунды, и, конечно же, он медленно отслеживает очень большие каталоги. Сказав это, я никогда не встречал проекта достаточно большого, чтобы это было заметно до тех пор, пока вы используете ‘-i’, чтобы игнорировать такие большие вещи, как ваш virtualenv и node_modules.
Хммм. rerun
была незаменима для меня в течение многих лет - в основном я использую ее по восемь часов каждый день для запуска тестов, восстановления точечных файлов во время их редактирования и т.д. Но теперь я пришел, чтобы напечатать это здесь, ясно, что мне нужно переключиться на решение, которое использует inotify (я больше не использую Windows и OSX.) и написано на Bash (так что оно работает с псевдонимами без лишних скрипок).