Поиск по сайту:

Как запустить команду Linux при изменении набора файлов


Узнайте, как запускать команды Linux при изменении любого файла в отслеживаемом наборе файлов и при создании новых файлов. Мы покажем вам, как использовать этот гибкий инструмент.

Команда входа

Вы можете настроить запуск команд в определенное время в Linux с помощью cron. Это просто, надежно и гибко. Но что, если вам нужно, чтобы команды выполнялись при каждом изменении файла или при добавлении нового файла в каталог? Это тоже возможно, и есть несколько способов сделать это. Команда entr — это очень простой способ реализовать эту функциональность.

В некоторых системах, например в генераторе статических сайтов Hugo, есть функция, которая автоматически перестраивает ваш сайт при изменении файла или при добавлении на сайт нового файла. Эта небольшая функция существенно меняет ваш рабочий процесс. С Hugo вы можете иметь разрабатываемую версию веб-сайта в своем браузере, когда редактируете файлы, из которых состоит ваш сайт. Каждый раз, когда вы сохраняете изменения или создаете файл, веб-сайт перестраивается за миллисекунды, и изменения передаются в ваш браузер. Мгновенная обратная связь — это здорово.

Команда entr обеспечивает такую возможность для любого набора файлов. Команда, которая запускается при обнаружении изменения, является произвольной. Это может быть стандартная команда Linux, псевдоним, функция оболочки или сценарий.

Установка входа

Чтобы установить entr в Ubuntu, используйте эту команду:

sudo apt-get install entr

Чтобы установить entr в Fedora, введите:

sudo dnf install entr

На Manjaro команда такая:

sudo pacman -Syu entr

Простой пример

Мы воспользуемся командой touch, чтобы создать текстовый файл с именем «example.txt» и указать entr отслеживать этот файл.

Команда entr принимает имена файлов, которые она должна отслеживать через STDIN, и принимает команду, которую она должна запускать, как параметры командной строки.

Самый простой способ передать имя файла в entr — использовать ls для его вывода и передать его в entr. Когда файл изменится, entr запустит команду wc для подсчета строк, слов и символов в файле.

Параметр /_ является заполнителем для имени файла, который был передан в entr. Если в entr передается группа файлов, например *.txt , параметр /_ будет заменен последним файлом, измененный.

touch example.txt
ls example.txt | entr wc /_

Каждый раз, когда изменения сохраняются в файле, entr запускает wc . Чтобы остановить entr, нажмите q или Ctrl+c .

Практическое использование

Теперь, когда мы увидели entr в действии и вы поняли принцип, давайте рассмотрим еще несколько полезных сценариев.

Мы заставим entr отслеживать файлы в текущем каталоге. Если какой-либо из файлов будет изменен, мы хотим, чтобы entr запускал make, чтобы мы могли пересобрать наш проект. Мы соединим еще одну команду, make test, чтобы запустить несколько тестов новой сборки. Оператор AND && запустит вторую команду только в том случае, если первая завершится без проблем.

Опция -s (оболочка) гарантирует, что используемый интерпретатор определен в переменной среды SHELL. Это гарантирует, что entr получит код выхода из первой команды make.

ls | entr -s 'make && make test'

Использование команды ls для отправки списка всех имен файлов в каталоге в entr немного неуклюже. У вас могут быть файлы в каталоге, которые являются частью проекта, но на самом деле не являются файлами сборки. Возможно, это заметки по дизайну или список дел. Вам не нужно пересобирать проект каждый раз, когда вы изменяете один из этих файлов, не относящихся к коду.

Мы можем уточнить команду, чтобы она отслеживала только соответствующие файлы исходного кода. Эта команда отслеживает исходный код C и файлы заголовков.

ls *.[ch] | entr -s 'make && make test'

Конечно, мы не ограничиваемся запуском make. У вас может быть собственный сценарий сборки, который вы предпочитаете использовать.

ls *.[ch] | entr script.sh

Использование Git

Команда entr не является программой Git, но мы все равно можем использовать некоторые возможности Git для упрощения нашего рабочего процесса.

Команда git ls-file выведет список файлов, находящихся в индексе Git и рабочем дереве исходного кода, с учетом исключений, определенных в вашем файле «.gitignore». Это готовый список файлов, которые нас интересуют, так что давайте использовать его в качестве источника файлов для мониторинга.

git ls-files | entr script.sh

Команда ls-files принимает параметры командной строки. Их можно использовать для дальнейшей фильтрации или дополнения списка файлов, возвращаемого Git:

  • -c: показать кэшированные файлы.
  • -d: показать удаленные файлы.
  • -m: показать измененные файлы.
  • -o: показать неотслеживаемые файлы.

Параметр --exclude-standard — это сокращенный способ указать Git игнорировать файлы, соответствующие записям в «.git/info/exclude», локальном «.gitignore» и глобальном «.gitignore». файлы.

git ls-files -cdmo --exclude-standard | entr 'make && make test'

Это уловит множество случайностей, но не справится с созданием нового файла. И нового файла не будет в Git. Мы все еще можем справиться с этой ситуацией, используя немного сценариев Bash и функцию entr.

Параметр -d (каталог) заставляет entr отслеживать файлы в каталоге и завершать работу при добавлении нового файла. Заключив нашу команду entr в цикл while/do, вся командная строка entr будет автоматически перезапущена, и будет выбран новый файл. вверх и действовать. Файлы и каталоги, имена которых начинаются с точки «.», игнорируются.

while true; do

  { git ls-files; git ls-files . --exclude-standard --others; } | entr -d ./script.sh

done

Перезапуск серверов и интерпретаторов

Возможно, вы работаете с интерпретируемым языком, таким как Ruby. Каждый раз, когда ваш программный файл изменяется, вам нужно останавливать и перезапускать интерпретатор Ruby. Вы можете обрабатывать эти типы вариантов использования с помощью параметра -r (перезапуск).

Чтобы отслеживать программный файл с именем «hello_world.rb», а также останавливать и перезапускать интерпретатор Ruby каждый раз при изменении программного файла, используйте эту команду:

ls hello_world.rb | entr -r ruby hello_world.rb

Каждый раз, когда программный файл редактируется и сохраняется, интерпретатор Ruby перезапускается и программа перезагружается.

Первоначально программа содержала:

puts "Hello, World!"

Он был отредактирован, чтобы сказать:

puts "Hello, CloudSavvyIT!"

После сохранения entr перезапустил интерпретатор Ruby и перезагрузил программу.

Файл был отредактирован еще раз, чтобы добавить слово «читатели» и сохранен на жестком диске.

puts "Hello, CloudSavvyIT readers!"

Вы можете увидеть три выхода на скриншоте. Если вы нажмете пробел, entr перезапустит команду независимо от того, изменили вы файл программы или нет.

Не только для программистов

Поскольку команда, запускаемая entr, может быть чем угодно, включая сценарии оболочки, возможности использования entr для автоматизации процессов практически безграничны.

Возможно, у вас есть каталог, в который файлы были переброшены через безопасный FTP, rsync или curl. Вы можете автоматически копировать эти файлы куда-то еще, или сжимать, или выполнять поиск с помощью grep по слову «ошибка».

Это делает его отличным инструментом как для системных администраторов, так и для разработчиков.