В моем случае я изменил /tmp
разрешения по умолчанию для каталога (Думаю, я изменил по ошибке на 0777 ).
Решение состояло в том, чтобы вернуться к разрешению по умолчанию /tmp
, которое равно 1777 в восьмеричной системе (1=липкий бит, 7=R+W+X ).
Короче говоря, sudo chmod -R 1777 /tmp
должен решить проблему.
Если вы тестируете это с
echo $ALL_FOUND_LINES
тогда я не удивлен, что все новые строки исчезли, так как оболочка разделила значение в $ALL_FOUND_LINES
на пробелы, табуляции и новые строки (по умолчанию )на слова (, а затем дополнительно расширила каждое слово с помощью генерации имени файла (подстановки )). Это происходит потому, что расширение не заключено в кавычки. Затем утилита echo
получает список слов, которые она печатает в одной строке.
Лучшим тестом было бы
printf '%s\n' "$ALL_FOUND_LINES"
Обратите внимание на заключение расширения переменной в кавычки. О выборе printf
вместо echo
см. . Почему printf лучше, чем echo? .
Ваша команда может быть улучшена до
find "$TEMP" -type f -name 'debug.log*' -exec grep -h -F 'STARTING HOST ' {} +
Здесь, вместо того, чтобы передавать имена файлов в xargs
, мы позволяем find
выполнять grep
напрямую для максимально возможного количества debug.log*
файлов одновременно. Обратите внимание, что избавление от xargs
не решит вашу проблему с новой строкой, так как xargs
не имеет к этому никакого отношения. Это немного ускорит работу, так как требует меньше вызовов grep
.
См. также Описание опции -exec команды `find`.
Если вам нужно что-то сделать с каждой из найденных строк, то вы можете перебрать их вот так:
find "$TEMP" -type f -name 'debug.log*' -exec grep -h -F 'STARTING HOST ' {} + |
while IFS= read -r line; do
# use "$line" here (with quotes)
done
(или замените цикл while на любой другой шаг обработки, который вам нужно выполнить ).Таким образом, нет необходимости хранить все данные в переменной в виде строки с разделителями новой строки -.
См. также Понимание "IFS= чтение -r строки"