Возможный обходной путь inotifywait не может производить вывод с разделителями NUL

Хорошо, я наконец нашел причину. Initramfs не был ключом к успеху.Получается, что routerboard работает, если он был загружен с нажатой кнопкой сброса. Но похоже, что прошитый драйвер долго не протянет. Маршрутизатор перезагружается с ошибкой ядра через несколько часов использования в зависимости от скорости загрузки.

4
08.05.2018, 03:47
2 ответа

Чтобы заменить любой //на /, вам потребуется очистить watchlist. Рассмотрим каталог с именем \nabc(, где \n— новая строка ):

.
$ mkdir t
$ mkdir t/$'\nabc'
$ touch t/$'\nabc'/x

При передаче каталога t//$'\nabc'вы увидите вывод с поддельным //в конце строк:

$ inotifywait -m -r t//$'\nabc' --format "%e %w%f//" 
Setting up watches.  Beware: since -r was given, this may take a while!
Watches established.
OPEN t//
abc/x//
ATTRIB t//
abc/x//
CLOSE_WRITE,CLOSE t//
abc/x//

Обратите внимание: вы также можете использовать -cвместо --formatдля получения вывода в стиле csv , в котором имена файлов в двойных -кавычках с переводом строки, но это сложнее анализировать, и в моем случае дампы ядра на приведенном выше примере.

Пример вывода для -cиtouch t/$'new\nfile':

t/,CREATE,"new
file"
2
27.01.2020, 20:54

Существует ответвление , которое поддерживает вывод с разделителями NUL -. Вы можете использовать его следующим образом:

#!/bin/bash

shopt -s extglob
watchlist=("${@}")

# Remove trailing slashes from any watchlist elements
watchlist=("${watchlist[@]%%+(/)}")

printf -vnewline "\n"

inotifywait -qrm "${watchlist[@]}" --format "%e %w%f%0" | \
while IFS= read -r -d '' line; do
    events="${line%% *}"
    filepath="${line#* }"
    printf "events=%s\nfilepath=%q\n" "$events" "$filepath"
done

Обратите внимание, что эта версия не добавляет новую строку по умолчанию при использовании формата --.

3
27.01.2020, 20:54

Теги

Похожие вопросы