Ну, вы знаете, что шаблон поиска содержит "-", и вы знаете, что, когда шаблон поиска содержит "-", вам нужно использовать флаг -e
. Поскольку вы не используете флаг -e
, оболочка вместо этого интерпретирует ваш «шаблон» как аргумент (и параметр). Вы можете увидеть это с помощью:
$ grep "-foo" file1
grep: oo: No such file or directory
По расширению ваш код grep "-example" file1
сообщает оболочке, что вы хотите запустить grep
с -e
аргумент и параметр «xample».
Это та же проблема, с которой мы сталкиваемся, когда пробуем что-то вроде rm -my-silly-file-name
- это не сработает, и нам нужно использовать что-то вроде rm. / -мое-глупое-имя-файла
вместо этого. Другой способ обхода - rm - -my-silly-file-name
. Мы можем использовать эту идиому здесь:
$ grep -- "-example" < file1
-example
Знак «-» сообщает оболочке, что все, что идет после него, не является аргументом.
В качестве альтернативы, вы можете просто экранировать "-" знаком "\", как вы видели:
grep "\-example" file1
В этой статье подробно рассказывается о цитировании : соответствующая часть - Параметры и обратные кавычки Команды, которые должна интерпретировать оболочка, заключаются в двойные кавычки. Когда вы используете двойные кавычки, содержимое интерпретируется оболочкой.