2015-08-04 5 views
0

Почему нет alias grep='grep -E' в моей работе .bashrc? Если я попытаюсь использовать одну из функций -E, например ?, это не сработает. Бонус: если бы это сработало, каковы были бы опасности, если таковые были? Почему grep не разрешает -E по умолчанию?`alias grep = 'grep -E'` не работает

EDIT: По предложению alias у меня есть alias grep='grep --color=auto'. Очевидно, что мой псевдоним .bashrc переписывается чем-то другим. Кроме того, некоторые другие псевдонимы, которые я написал, появляются, когда я запускаю alias. Есть идеи? Я на ubuntu.

EDITT: В моем .bashrc были псевдонимы, которые я не видел (я их не писал). Извините за то, что тратишь свое время!

+0

Если '' grep' включен -E' по умолчанию, это было бы несовместимо со стандартом POSIX, который требует поддержки BRE по умолчанию. –

+0

... что за что-то работает или не работает в вашем .bashrc, это зависит от того, как ваш .bashrc вызывается из других dotfiles; это не то, от чего мы можем ответить здесь более подробно. –

+1

Попробуйте запустить 'alias'; посмотрите, существует ли там псевдоним. Если это не так, запустите '. ~/.bashrc', и посмотрите, исправляет ли он это. Если это так, то проблема является чем-то специфичным для ваших dotfiles вашей операционной системы; если вы не изменили их значительно по сравнению с предоставленными поставщиком стандартами по умолчанию, вы можете задать вопрос, помеченный вашей конкретной ОС, на http://superuser.com/, если это так, и вы уже не можете найти что-то на месте , –

ответ

1

Если это не работает в вашем .bashrc, убедитесь, что указанное .bashrc было действительно вызвано в вашей активной оболочке; например, запустите alias и убедитесь, что указанный псевдоним указан.

То, что это не проблема с псевдонимом в целом, или с Grep, легко показать:

$ alias grep='grep -E' 
$ echo 'foo' | grep 'fo+' 
foo 
$ unalias grep 
$ echo 'foo' | grep 'fo+' 
$ 

Таким образом, это проблема с вашим составляют скрытые; ничего не зная о них, мы не можем вам помочь. (Тем не менее, вы можете убедиться, что ваш .bash_profile источник вашего .bashrc).


Теперь более интересный вопрос, который вы просили это почему ERE отключена по умолчанию, и что последствия изменения, которые были бы.

См стандарт POSIX руководящих grep:

Утилита Grep будет искать входные файлы, выбирая строки, соответствующие один или несколько шаблонов; типы шаблонов контролируются указанными опциями. Шаблоны задаются параметром -e, -f или операндом pattern_list. Значение pattern_list должно состоять из одного или нескольких шаблонов, разделенных <newline> s; содержимое шаблона_файла должно состоять из одного или нескольких шаблонов, заканчивающихся номером <newline>. По умолчанию входная строка выбирается, если любой шаблон, рассматриваемый как общее базовое регулярное выражение (BRE), как описано в томе базовых определений IEEE Std 1003.1-2001, раздел 9.3, «Основные регулярные выражения», соответствует любой части строка, исключающая завершение; нулевой BRE должен соответствовать каждой строке. По умолчанию каждая выбранная строка ввода должна быть записана на стандартный вывод.

Таким образом: Любая версия grep, для которой по умолчанию не были BRE, несовместима с стандартом POSIX.

Это сломает некоторые запросы; например:

grep -e '(foo)' in.txt 

... ищет буквальной скобку в файле ввод. Если интерпретироваться как ERE, он будет рассматривать parens как операторы группировки, тем самым сопоставляя строки, которые оригинальный автор вышеприведенного кода не намеревался.

+0

Поскольку он делает это только в своих интерактивных оболочках, почему он не должен делать дефолт, что он предпочитает? Это не влияет ни на что другое. – Barmar

+0

@Barmar, создавая команды, работающие в интерактивном режиме, которые сломаются, если они вырезаны и вставляются в скрипт, - это плохая идея с точки зрения попыток сформировать хорошие привычки, если ничего другого. Аналогично, для команд, которые ломаются, когда они запускаются на другом компьютере или в чужой учетной записи. Аналогичным образом, за то, что он (un) умеет использовать советы, предоставленные на SO и в других местах, дословно, не пересматривая его для несовместимости с локальными изменениями. –

+0

Я думаю, вы не очень верите в команды, которые позволяют вам устанавливать параметры по умолчанию в переменных среды, например '$ LESS'. – Barmar

0

Вы проверяете список псевдонимов?Вы можете проверить его командой alias. В моей среде (CentOS6.6) она работает.

Пример:

$ cat ~/.bashrc 
alias grep='grep -E' 

$ alias | grep grep 
alias grep='grep -E' 

$ cat test.txt 
abc 
abcc 
abd 

$ grep "abcc?" test.txt 
abc 
abcc 
+0

См. Редактирование. –

Смежные вопросы