Napisałem program Pythona, aby zrobić dokładnie to, nazwany rerun
.
UPDATE: Ta odpowiedź to skrypt Pythona, który bada zmiany, co jest przydatne w pewnych okolicznościach. Dla linuksowego skryptu Bash, który używa inotify, zobacz moją drugą odpowiedź, poszukaj na tej stronie ‘rerun2’.
Instalacja dla Pythona2 lub Pythona3 za pomocą:
pip install --user rerun
i użycie jest bardzo proste:
rerun "COMMAND"
Komenda jest oczekiwana jako pojedynczy argument, a nie sekwencja oddzielonych spacjami argumentów. Dlatego zacytuj ją tak, jak pokazano na rysunku, co redukuje dodatkową ucieczkę, którą musiałbyś dodać. Po prostu wpisz polecenie tak, jak byś je wpisał w linii poleceń, ale otoczony cudzysłowami.
Domyślnie obserwuje wszystkie pliki w lub pod bieżącym katalogiem, pomijając rzeczy takie jak znane dirs kontroli źródeł, .git, .svn, itp.
Flagi opcjonalne zawierają ‘-i NAME’, które ignorują zmiany nazw plików lub katalogów. Można to podawać wielokrotnie.
Ponieważ jest to skrypt w języku Python, musi on uruchomić polecenie jako podproces, a my używamy nowej instancji aktualnej powłoki użytkownika do interpretacji ‘COMMAND’ i decydowania o tym, który proces ma być faktycznie uruchomiony. Jednakże, jeżeli twoje polecenie zawiera aliasy powłoki i tym podobne, które są zdefiniowane w .bashrc, nie zostaną one załadowane przez podpowłokę. Aby to naprawić, możesz podać flagę ‘-I’, aby użyć podpowłoki interaktywnej (zwanej też ‘login’). Jest to wolniejsze i bardziej podatne na błędy niż uruchamianie zwykłej powłoki, ponieważ musi ona generować twój .bashrc.
Używam jej z Pythonem 3, ale ostatnio sprawdziłem, że ponowne uruchamianie nadal działa z Pythonem 2.
Dwuwarstwowy miecz jest taki, że używa pollingu zamiast inotify. Z drugiej strony, oznacza to, że działa na każdym systemie operacyjnym. Plus, jest to lepsze niż niektóre inne rozwiązania pokazane tutaj, jeśli chodzi o uruchamianie danej komendy tylko raz na kilka zmian w systemie plików, a nie raz na jeden zmodyfikowany plik, podczas gdy w tym samym czasie uruchamia ona komendę po raz drugi, jeśli jakieś pliki ponownie się zmienią podczas uruchamiania komendy.
Z drugiej strony, polling oznacza, że istnieje opóźnienie od 0.0 do 1.0 sekundy, i oczywiście jest powolny w monitorowaniu bardzo dużych katalogów. Mimo to, nigdy nie spotkałem się z projektem na tyle dużym, że jest to nawet zauważalne, tak długo jak używasz ‘-i’ do ignorowania dużych rzeczy, takich jak twój wirtualnyenv i węzeł :-).
Hmmm. rerun
jest dla mnie niezbędny od lat - w zasadzie używam go osiem godzin dziennie do przeprowadzania testów, przebudowywania plików kropkowych podczas ich edycji, itp. Ale teraz przychodzi mi to pisać tutaj, jasne jest, że muszę przejść na rozwiązanie, które wykorzystuje inotify (nie używam już Windows ani OSX) i jest napisane w Bashu (więc działa z aliasami bez dodatkowych manipulacji).