выход из входа внутри скрипта
После некоторого поиска в 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.