2016-01-27 2 views
0
> ps -ef | grep cron 

root  1052  1 0 04:35 ?  00:00:00 cron 
test 4071 4053 0 10:15 pts/0 00:00:00 grep --color=auto cron 

> ps -ef | grep cr[o]n 

root  1052  1 0 04:35 ?  00:00:00 cron 

Почему эти две команды возвращают разные результаты, когда срок поиска эквивалентен?Почему grep возвращает разные результаты при использовании регулярных выражений?

+0

Если вы не смогли поставить регулярное выражение внутри кавычек, то он будет интерполирован оболочкой –

+0

Спасибо. Как это может измениться? Даже если в оболочке есть интерполяция, почему результаты разные? – vaerek

+0

Это древний FAQ. У вас вообще был Google? – tripleee

ответ

3

Потому что во втором случае процессы, выполняемые на самом деле (Altough второй вы не можете увидеть после того, как Grep применяется фильтр):

root  1052  1 0 04:35 ?  00:00:00 cron 
test 4071 4053 0 10:15 pts/0 00:00:00 grep --color=auto cr[o]n 

И cr[o]n не сопровождается cr[o]n в [o] задает список символов o, в то время как настоящая строка содержит также [ и ] вокруг o.

1

Команда

> ps -ef | grep cron 

соответствует строке "хрон" в команде, давая вам

test 4071 4053 0 10:15 pts/0 00:00:00 grep --color=auto cron 

Однако команда

> ps -ef | grep cr[o]n 

НЕ соответствует строке «кр [o] n "в самой команде, опустив ее из результата.

-1

Не для всех, если вы повторяете команду несколько раз, выход будет отличаться для обоих классов команд. Причина в том, что вывод зависит от команды grep, выполняемой во время загрузки ps. Слой Bash запускает обе команды в быстрой последовательности, но иногда команда ps(1) получает информацию, когда bash(1) еще не успел запустить grep(1).

Оба регулярных выражения полностью эквивалентны, поскольку cr[o]n точно такой же, как cron.

Сделайте тестовый запуск несколько раз ps -ef | grep grep и увидите, что иногда появляется команда grep, а иногда нет.

+0

Режимы не являются полностью эквивалентными; 'cr [o] n' не соответствует самому себе. – tripleee

+0

Хорошо, вы правы, но я прав, если вы мне не верите, просто выполните несколько раз команду, и вы увидите, что я прав. И я по этой причине не остановил вас. –

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