Я пытаюсь рекурсивно искать строку, grep
но я получаю это:
$ grep -r "stuff" *
grep: unrecognized option '---corporate-discount.csv'
Usage: grep [OPTION]... PATTERN [FILE]...
Try 'grep --help' for more information.
Как я могу запретить Bash передавать файлы, начинающиеся с -
аргумента?
grep
, что это не варианты.subprocess.Popen(['grep', '-r', '-e' 'stuff', '--corporate-discount.csv'])
в Python, нигде нет.*
команд. ВСЕ из них можно избежать, используя./*
вместо этого.--
в качестве символа конца опций также вполне разумно; Руководство по синтаксису утилит POSIX требует его соблюдения; см. рекомендацию № 10. (Конечно, не все программы следуют рекомендациям POSIX, но ответ состоит в том, чтобы привести в порядок авторов вредоносных программ и / или исключить их из отрасли).Ответы:
Во-первых, обратите внимание, что интерпретация аргументов, начинающихся с тире, зависит от запускаемой программы
grep
или другой. Оболочка не имеет прямого способа ее контролировать.Предполагая, что вы хотите обработать такие файлы (и не игнорировать их полностью)
grep
, наряду с большинством программ распознает--
как указывающий конец параметров, поэтомубудет делать то, что вы хотите. Это
-e
есть в том случае, еслиstuff
начинается с-
.Кроме того, вы также можете использовать:
Этот последний также позволит избежать проблемы, если
-
в текущем каталоге был вызван файл . Даже после--
разделителяgrep
интерпретируется-
как значение stdin, а./-
файл вызывается-
в текущем каталоге.источник
Чтобы запретить расширению Bash передавать файлы, начинающиеся с «-», вы можете использовать:
Который работает переносимо в большинстве оболочек, или, специфично для ksh, bash, zsh:
Например: в каталоге с этими файлами
Список только (при условии
extglob
, активен):Но если вам нужно обработать все файлы, указав grep, чтобы не интерпретировать файлы, указанные
-
в параметрах a , то просто добавьте./
:Или, если есть гарантия того, что
-
в списке нет файлов, вызываемых в точности (grep будет интерпретировать одинокий-
как прочитанный из stdin ), вы можете использовать:источник
grep -r -- stuff *
проще, и работает также с не GNUish greps. Итак: добавил, спасибо. @ StéphaneChazelasgrep
во FreeBSD по-прежнему основан на GNUgrep
и по-прежнему имеет тот недостаток, при котором опции распознаются после неопций. Даже BSDs как OpenBSD , которые переписаны ихgrep
сделали их GNU совместимы для обратной портативности (и до сих пор показывают , что поведение здесь). В macOS sh - это bash, но я ожидаю, что их grep не покажет, что поведение macOS подразумевает совместимость с POSIX даже без $ POSIXLY_CORRECT. В любом случае, Grep в OP в это GNU-совместимый , так как он дает эту ошибку.echo [!-]*
как стандартный эквивалент ksh (илиbash -O extglob
s)echo !(-*)
.