За два с половиной месяца, что прошли после выхода GNU grep 2.10, рассказывает разработчик GNU grep Jim Meyering, произошло больше изменений, чем за 5 месяцев разработки grep 2.10, при этом обнаружилось неожиданно много старых ошибок. Отдельное спасибо Paulo Bonzini и Paul Egger за их патчи.
Заметные изменения
- Новые особенности
- Если не задан файловый операнд и задана опция -r или равнозначная ей, grep теперь выполняет поиск в текущей директории. Прежде grep игнорировала опцию -r и работала с входящим потоком. Опция -r в переменной GREP_OPTIONS не даёт такого эффекта;
- добавлена подсветка цветом совпадений в MS Windows.
- Исправленные ошибки
- grep больше не падает, когда длина строк не укладывается в 'int' (длиннее 2 GiB на типичной 64-битной системе). Теперь grep либо отрабатывает, как и ожидалось, либо сообщает об ошибке. Ошибка может происходить, если недостаточно памяти, либо если функции для работы с регулярными выражениями в библиотеке GNU C не поддеживают столь длинные строки [ошибка присутствовала от начала времен];
- использование опций -m, -A, -B, -C больше не приводит к перемешиванию строк, когда их число не укладывается в 'int'. Кроме того, количество строк, выводимых grep -c, теперь ограничено значением 'intmax_t' (обычно менее 2^63), а не 'int' (обычно менее 2^31);
- ранее grep «молча» пропускала ошибки, когда вместо ожидаемого текстового файла была задана директория. Теперь же сообщение об ошибке выводится. Например, теперь команда `grep x .' сообщает об ошибке чтения, а не игнорирует её, как раньше [ошибка появилась в версии grep-2.5];
- grep завершается с кодом ошибки 2, если обнаружено зацикливание директорий. Ранее grep завершалась с кодом ошибки 0 или 1 [ошибка появилась в версии grep-2.3];
- опция -s теперь подавляет сообщения об ошибках с входным потоком, которые раньше не подавлялись. Сюда относятся ошибки при закрытии потока, при использовании функции lseek или же когда входной и выходной потоки совпадают [ошибка появилась в версии grep-2.4];
- на системах POSIX, команды вроде «grep < FILE >> FILE» теперь сообщают об ошибке, вместо зацикливания [ошибка присутствовала с самого начала];
- опции --include, --exclude и --exclude-dir теперь обрабатываются более последовательно. --include и --exclude теперь применяются только к недиректориям, а --exclude-dir — только к директориям. При этом "-" (стандартный вывод) никогда не исключается, так как это не имя файла [ошибка появилась в версии grep-2.5];
- grep больше не отбрасывает команды «grep -qr . > out», такие, где задана опция -q и файлы ввода и вывода совпадают. В этом нет надобности, опция -q подавляет вывод, и нет опасности зацикливания или состояния гонок. Thus, the use of the following
options also disables the input-equals-output failure:
- --max-count=N (-m) (for N >= 2)
- --files-with-matches (-l)
- --files-without-match (-L)
- grep больше не сообщает об ошибке и завершает работу на MS-Windows, когда запущена с опцией -r;
- grep больше не ошибается при обработке регулярных выражений, где чередования включают «якоря» (^, $, \<, \>, \b, \B). Например, `grep -E "(^|\B)a" больше не сообщает о совпадении для строки «x a» [ошибка присутствовала с начала разработки grep];
- Изменения в поведении
- при использовании опции --mmap выводится предупреждение. Эта опция ни на что не влияет с марта 2010-го года;
- grep больше не сообщает об ошибках записи повторно; теперь grep завершает работу после обнаружения первой же ошибки. Такое поведение лучше при работе с повисшим туннелем;
- синтаксические ошибки в GREP_COLORS теперь просто игнорируются, без предупреждений. Такое поведение более согласовано с другими программами, которые, для примера, игнорируют ошибки в termcap.
Исходные коды программы доступны для скачивания: http://ftpmirror.gnu.org/grep/grep-2.11.tar.xz
>>> Подробности