выход из входа внутри скрипта

После некоторого поиска в Google я нашелутилита для запуска команды при обновлении файла. Я могу заставить его работать, но, к сожалению, я не могу выйти из него.

Литература по этому поводу для меня невелика и весьма расплывчата. Мне нужно поведение, например

  • обнаружить изменение файла
  • запустите мою команду (установив VAR в скрипте вызывающего абонента)
  • Выход

Но не уверен, как этого добиться. Вызовentrкажется, что это бесконечный цикл, он работает бесконечно.

Довольно странно, что я не смог найти подобных вариантов использования. (https://github.com/eradman/entr)

Стоит ли мне начинать играть сinotifywaitиз пакета inotify-tools?

2 ответа

Спасибо @Kamil Maciorowski за подробный ответ.

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

хотяentrкажется, это классный маленький инструмент, я выбралinotifywait:

      inotifywait -q -e close_write $buff_file_path |
while read -r filename event; do
    :
done
result=$(cat $buff_file_path)

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

Мое первоначальное описание проблемы/желаемого результата немного сомнительно, мне придется поработать над написанием достойных вопросов.

Благодарность принадлежит добрым людям в этой теме.

Официальное примечание

Ваш явный вопрос:

Стоит ли мне начинать играть сinotifywaitиз пакета inotify-tools?

Я не могу на это ответить. Ответы на вопрос «Должен ли я?» в любом случае обычно основаны на мнениях. Я думаю, что неявный вопрос: «Как мне выйти из скрипта?». Ответ на этот вопрос ниже.


Решение

Следующая команда:

      entr -p sh -c 'kill -s INT "$PPID"; actual command(s)'

(при запуске) вызовет оболочку, которая убьет своего родителя (т. е.), а затем выполнит .


Примечания

  • Без бы выполнитьshсразу и быть убитым сразу. Тебе нужно . Отman 1 entr:

    -p    Отложите первый запуск утилиты до изменения файла.

  • принимает команду для выполнения (исполняемый файл + аргументы) в качестве отдельных аргументов. Синтаксис вроде:

            entr echo "$var"
    

    все в порядке. Однако вы передаете шелл-код — строку, которая будет интерпретироваться оболочкой. Нашactual command(s)будет анализироваться оболочкой. Если вам нужно, чтобы внешняя оболочка что-либо расширила и перешла во внутреннюю оболочку, не делайте этого:

    entr -p sh -c 'kill -s INT "$PPID";'" echo $var"

    ни чего подобного. Чтобы сделать это безопасно, создайте шелл-код (опция-аргумент дляsh -c) static и использовать позиционные аргументы для передачи значений переменных. Пример:

            entr -p sh -c 'kill -s INT "$PPID"; echo "$1"' sh "$var"
    

    Здесь, даже если$varрасширяется до; rogue code,'; rogue code,'$(rogue code)или что-то еще, он не сможет взломать реальный шелл-код.

    (Сравните «никогда не вставлять {}в шелл-коде", это, по сути, та же проблема.)

  • Ваша цель — «установить VAR в скрипте звонящего». Без отладчика только оболочка, интерпретирующая сценарий, может изменять свои собственные переменные. Команда, запущенная подentrне могу этого сделать. Вы можете захватить его вывод или записать его в файл, а затем позволить оболочке прочитать файл. См. ответы на этот вопрос: Захват определенной переменной среды из подоболочки Linux.

Другие вопросы по тегам