LINUX.ORG.RU
ФорумTalks

Закат эпохи egrep и fgrep

 ,


0

1

С выходом GNU grep 3.8 команды egrep и fgrep начали предупреждать юзера, что они deprecated с 2007-го года.

$ egrep Intel /proc/cpuinfo
egrep: warning: egrep is obsolescent; using grep -E
$ fgrep Intel /proc/cpuinfo
fgrep: warning: fgrep is obsolescent; using grep -F
$
Changelog: https://fossies.org/linux/grep/NEWS
Скачать: https://ftp.gnu.org/gnu/grep/grep-3.8.tar.xz

★★★★★

Это для тех у кого egrep/fgrep это линки на grep

В дебиане это не так

$ cat /usr/bin/egrep
#!/bin/sh
exec grep -E "$@"

$ cat /usr/bin/fgrep
#!/bin/sh
exec grep -F "$@"
futurama ★★★★★
()
Ответ на: комментарий от futurama

Теперь будет так:

$ cat /bin/egrep
#!/bin/sh
cmd=${0##*/}
echo "$cmd: warning: $cmd is obsolescent; using grep -E" >&2
exec grep -E "$@"
$ cat /bin/fgrep
#!/bin/sh
cmd=${0##*/}
echo "$cmd: warning: $cmd is obsolescent; using grep -F" >&2
exec grep -F "$@"
$

saahriktu ★★★★★
() автор топика
Ответ на: комментарий от futurama

Эти скрипты из состава самого grep'а. И закат эпохи egrep и fgrep касается, отнюдь, не только тех, у кого они ссылками на grep.

saahriktu ★★★★★
() автор топика
Ответ на: комментарий от hateyoufeel

Although breaking up grep into three programs was perhaps useful on the small computers of the 1970s, egrep and fgrep were not standardized by POSIX and are no longer needed.

saahriktu ★★★★★
() автор топика
Ответ на: комментарий от futurama

Кто-то запретит их (скрипты) положить в /bin/, если греповцы их (скрипты) выкинут?

Нет, но это уже будут самодеятельность и самобытность.

При этом уже нет никаких «если». В апстриме grep'а

they are planned to be removed entirely

saahriktu ★★★★★
() автор топика

Интересно, а ими кто-то пользовался на постоянной основе?

anc ★★★★★
()
Ответ на: комментарий от saahriktu

egrep and fgrep were not standardized by POSIX

POSIX не актуален уже давно.

are no longer needed.

Написать egrTAB гораздо быстрее выходит, чем grep -E.

hateyoufeel ★★★★★
()
Последнее исправление: hateyoufeel (всего исправлений: 1)

Лёгким мановением руки сломались миллионы скриптов. Нахера так делать вообще, я в смысле про предупреждения в программе которая в 9999% случаев используется в паре с другой программой через трубы?

LINUX-ORG-RU ★★★★★
()
Ответ на: комментарий от saahriktu

Вообще не вижу логики. Какие «три программы», если такое всю дорогу делалось симлинками с селекцией по argv[0] (у дебиана со скриптами какая-то чисто дебилиановская самодеятельность)? Давайте ещё gunzip объявите deprecated, есть же gzip -d!

alegz ★★★★
()
Последнее исправление: alegz (всего исправлений: 1)
Ответ на: комментарий от alegz

Какие «три программы», если такое всю дорогу делалось симлинками с селекцией по argv[0]

Пишут, что в 1970-х это были 3 отдельные программы. А выпиливать они начали как раз именно с такой реализации с симлинками.

В давние времена GNU grep как раз состоял из одного grep.c, где проверялось с каким именем вызван бинарник. Потом это дропнули в районе 2007-го года. И с того времени проект GNU grep считал, что отдельные команды egrep и fgrep у них deprecated. И теперь они решили предупредить об этом юзеров, а потом оставить только опции -E и -F.

saahriktu ★★★★★
() автор топика
Ответ на: комментарий от LINUX-ORG-RU

предупреждения в stderr идут и в трубу не попадают и не влияют на работу

futurama ★★★★★
()
Ответ на: комментарий от saahriktu

это уже будут самодеятельность и самобытность.

пофиг же

futurama ★★★★★
()

Проблемы мышей кота не волнуют:

$ ls -l /usr/bin/egrep
-r-xr-xr-x  4 root  wheel  30744 May 17 23:09 /usr/bin/egrep
$ ls -l /usr/bin/fgrep
-r-xr-xr-x  4 root  wheel  30744 May 17 23:09 /usr/bin/fgrep
$ file -b /usr/bin/egrep
ELF 64-bit LSB pie executable, x86-64, version 1 (FreeBSD), dynamically linked, interpreter /libexec/ld-elf.so.1, for FreeBSD 13.1, FreeBSD-style, stripped
$ file -b /usr/bin/fgrep
ELF 64-bit LSB pie executable, x86-64, version 1 (FreeBSD), dynamically linked, interpreter /libexec/ld-elf.so.1, for FreeBSD 13.1, FreeBSD-style, stripped
mord0d ★★★★★
()
Ответ на: комментарий от emorozov

Хардлинки?

Да.

Что говорит ls -li?

$ ls -li /usr/bin/*grep
 2128 -r-xr-xr-x  15 root  wheel   4179 May 17 23:09 /usr/bin/bzegrep
 2128 -r-xr-xr-x  15 root  wheel   4179 May 17 23:09 /usr/bin/bzfgrep
 2128 -r-xr-xr-x  15 root  wheel   4179 May 17 23:09 /usr/bin/bzgrep
 2219 -r-xr-xr-x   4 root  wheel  30744 May 17 23:09 /usr/bin/egrep
 2219 -r-xr-xr-x   4 root  wheel  30744 May 17 23:09 /usr/bin/fgrep
 2219 -r-xr-xr-x   4 root  wheel  30744 May 17 23:09 /usr/bin/grep
 2128 -r-xr-xr-x  15 root  wheel   4179 May 17 23:09 /usr/bin/lzegrep
 2128 -r-xr-xr-x  15 root  wheel   4179 May 17 23:09 /usr/bin/lzfgrep
 2128 -r-xr-xr-x  15 root  wheel   4179 May 17 23:09 /usr/bin/lzgrep
34935 lrwxr-x---   1 root  wheel     15 Nov  5  2019 /usr/bin/pgrep -> ../../bin/pgrep
 2219 -r-xr-xr-x   4 root  wheel  30744 May 17 23:09 /usr/bin/rgrep
 2128 -r-xr-xr-x  15 root  wheel   4179 May 17 23:09 /usr/bin/xzegrep
 2128 -r-xr-xr-x  15 root  wheel   4179 May 17 23:09 /usr/bin/xzfgrep
 2128 -r-xr-xr-x  15 root  wheel   4179 May 17 23:09 /usr/bin/xzgrep
 2128 -r-xr-xr-x  15 root  wheel   4179 May 17 23:09 /usr/bin/zegrep
 2128 -r-xr-xr-x  15 root  wheel   4179 May 17 23:09 /usr/bin/zfgrep
 2128 -r-xr-xr-x  15 root  wheel   4179 May 17 23:09 /usr/bin/zgrep
 2128 -r-xr-xr-x  15 root  wheel   4179 May 17 23:09 /usr/bin/zstdegrep
 2128 -r-xr-xr-x  15 root  wheel   4179 May 17 23:09 /usr/bin/zstdfgrep
 2128 -r-xr-xr-x  15 root  wheel   4179 May 17 23:09 /usr/bin/zstdgrep

Ну и стоит отметить, что у нас тут BSD grep (собственно, об этом и был мой первый комментарий):

$ grep -V
grep (BSD grep, GNU compatible) 2.6.0-FreeBSD
mord0d ★★★★★
()
Ответ на: комментарий от grem

В Linux нет базовой системы (оно ж не ОС!), потому и "базовая система" может сильно различаться от дистрибутива к дистрибутиву.

mord0d ★★★★★
()

Ну и правильно. Зря пространство имён в $PATH только захламляют. Как-то сделал себе для локальных целей утилиту то ли скрипт с названием fgrep (НЕ алиас к grep -F а другой функционал, не помню уже какой), положил в ~/bin/ всё удобно итд, а потом понадобилось что-то скомпилировать, а оно падает. Выяснилось, где-то внутри то ли configure то ли makefile был вызов fgrep, который теперь попадал на мою утилиту и естественно ломал сборку. Пришлось переименовывать в f_grep.

firkax ★★★★★
()
Последнее исправление: firkax (всего исправлений: 1)
Ответ на: комментарий от ugoday

Эта та, которая обеспечивает работу пакетного менеджера, помимо самой системы. Толку от ripgrep, если его нельзя использовать в скриптах установки софтаиз официального репозитория?

grem ★★★★★
()
Последнее исправление: grem (всего исправлений: 1)
Ответ на: комментарий от grem

Толку от ripgrep, если его нельзя использовать в скриптах установки софтаиз официального репозитория?

используйте в других скриптах

ugoday ★★★★★
()
Ответ на: комментарий от grem

Толку от ripgrep, если его нельзя использовать в скриптах установки софтаиз официального репозитория?

В нормальных пакетных менеджерах — можно.

theNamelessOne ★★★★★
()
Ответ на: комментарий от theNamelessOne

Ты не из тех, кто установщики winrar хранил в архивах winrar?

grem ★★★★★
()
Ответ на: комментарий от saahriktu

Ты в курсе, что это совсем разные вещи? grep -F ищет строки, а просто grep - регулярки. Особенно часто любители недописывать -F спотыкаются на точках в паттерне, которые без -F вовсе не точки а вилдкарды, и grep находит кучу лишнего ненужного.

firkax ★★★★★
()
Ответ на: комментарий от Suigintou

C/C++ помойму слегка не для этого, не? Всякое такое

template<typename _CharT, typename _Traits, typename _Alloc>
class basic_string{
public:
     static const size_type    npos = static_cast<size_type>(-1);
private:
    struct _Rep_base{
        size_type            _M_length;  //по умолчанию инстанцируется в size_t
        size_type            _M_capacity;
        _Atomic_word   _M_refcount;
    };
    struct Rep:_Rep_base{
        static const size_type         _S_max_size; //(((npos - sizeof(_Rep_base))/sizeof(_CharT)) - 1) / 4
        static const _CharT            _S_terminal;   
        static size_type                    _S_empty_rep_storage[]; // Массив заполняемый нулями длиной (sizeof(_Rep_base) + sizeof(_CharT) + sizeof(size_type) - 1) /sizeof(size_type)
    };

    struct _Alloc_hider : _Alloc{    
        _Alloc_hider(_CharT* __dat, const _Alloc& __a) : _Alloc(__a), _M_p(__dat) { } 
       _CharT* _M_p; // указатель на массив символов. 
      };  
      mutable _Alloc_hider      _M_dataplus;
};

городить заместо лаконичного кода на AWK очень на любителя)

projectorist
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.