Реконструкция записи, разделенной табуляцией, в bash не работает

Я считаю, что ошибку «Отказано в доступе» легко решить, манипулируя /sys/kernel/debug/tracing/set_event от имени пользователя root.

Еще одна идея состоит в том, чтобы выяснить, возникла ли ваша проблема с самого начала или что-то ее вызвало. В первом случае наивным подходом было бы загрузиться с большинством отключенных драйверов, а затем повторно включить их один за другим, чтобы найти виновника.

Если что-то вызывает проблему, нам нужно знать, что именно. Я видел случаи, когда чрезмерная загрузка ЦП была вызвана скачком дискового ввода-вывода, и настройка параметров /proc/sys/vm/, связанных с кэшированием, очень помогла.

0
13.04.2016, 18:22
2 ответа

Ваша проблема решена Почему мой сценарий оболочки подавляется пробелами или другими специальными символами? . Я просто кратко объясню, что здесь происходит.

Причина - для r в $ {documents [@]} . Поскольку расширение переменной не заключено в кавычки, вы используете операцию «split + glob»: значение каждого элемента массива разбивается на слова в соответствии со значением IFS , и каждое слово обрабатывается как шаблон подстановочного знака. Поскольку вы всегда устанавливаете IFS только на время чтения (см. Почему так часто используется `while IFS = read` вместо` IFS =; при чтении. .`? ), значение IFS в этот момент является значением по умолчанию, которое включает пробелы. Кроме того, если у вас есть поле, содержащее что-то вроде foo * , вы увидите имена файлов в текущем каталоге.Решением является для r в "$ {documents [@]}" , что является стандартным способом итерации по массиву: двойные кавычки превращают это в прямое разыменование переменной без разделения и подстановки, и [@] заставляет каждый элемент массива помещаться в отдельное слово.

Хотя установка IFS = $ '\ t' для всего скрипта, похоже, решает проблему, на самом деле это решает только половину проблемы: это не предотвращает глобализацию с $ {документы [@]} . Хотя вы можете отключить подстановку с помощью set -f , использование двойных кавычек более понятно.

4
28.01.2020, 02:17

Очевидно, проблема заключалась в нескольких объявлениях IFS = $ '\ t' . Удаление их и наличие одного объявления для IFS , похоже, решило проблему.

(Хотя, хоть убей, я не понимаю , почему это было проблемой. Должно быть, была тонкая опечатка.)

1
28.01.2020, 02:17

Теги

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