Próbuję rekurencyjnie wyszukiwać ciąg, grep
ale otrzymuję to:
$ grep -r "stuff" *
grep: unrecognized option '---corporate-discount.csv'
Usage: grep [OPTION]... PATTERN [FILE]...
Try 'grep --help' for more information.
Jak mogę uniemożliwić Bashowi przekazywanie plików zaczynających się -
od argumentu?
grep
że nie są to opcje.subprocess.Popen(['grep', '-r', '-e' 'stuff', '--corporate-discount.csv'])
w Pythonie, bez niczyjej nuty.*
poleceń. Wszystkich tych można uniknąć, używając./*
zamiast tego.--
sigilu końca opcji jest również całkowicie uzasadnione; Wytyczne dotyczące składni narzędzi POSIX wymagają, aby były honorowane; patrz wytyczna nr 10. (Oczywiście, nie wszystkie programy są zgodne z wytycznymi POSIX, ale odpowiedzią jest napisanie autorów programów naruszających zasady i / lub wyrzucenie ich z branży).Odpowiedzi:
Po pierwsze, zauważ, że interpretacja argumentów zaczynających się od myślników zależy od uruchamianego programu
grep
lub innego. Powłoka nie ma bezpośredniego sposobu na kontrolowanie tego.Zakładając, że chcesz przetwarzać takie pliki (i nie ignorować ich całkowicie)
grep
, wraz z większością programów rozpoznaje--
jako wskazujące koniec opcji, więczrobi co chcesz.
-e
Istnieje w przypadkustuff
rozpoczyna się-
również.Możesz także użyć:
Ten ostatni uniknąłby również problemu, gdyby
-
w bieżącym katalogu był plik wywoływany . Nawet po--
separatorzegrep
interpretuje-
jako znaczenie stdin, podczas./-
gdy plik jest wywoływany-
w bieżącym katalogu.źródło
Aby zapobiec przekazywaniu plików przez rozszerzenie Bash zaczynając od „-” , możesz użyć:
Który działa przenośnie w większości powłok lub, specyficznie dla ksh, bash, zsh:
Na przykład: w katalogu z tymi plikami
Wyświetla tylko listę (pod warunkiem, że
extglob
jest aktywna):Ale jeśli chcesz przetworzyć wszystkie pliki, mówiąc grep, aby uniknąć interpretacji plików oznaczonych
-
opcjami jako, to po prostu dodaj./
:Lub, jeśli istnieje gwarancja, że żaden plik o nazwie dokładnie nie
-
istnieje w wymienionych plikach (grep zinterpretuje plik samotny-
jako odczytany ze standardowego wejścia ), możesz użyć:źródło
grep -r -- stuff *
jest prostsze i działa również z grepami innymi niż GNUish. Więc: dodane, dziękuję. @ StéphaneChazelasgrep
na FreeBSD nadal opiera się na GNUgrep
i nadal ma tę wadę, że opcje są rozpoznawane po braku opcji. Nawet BSD, takie jak OpenBSD, które je przepisały,grep
sprawiły, że są kompatybilne z GNU, co umożliwia przenośność wsteczną (i nadal pokazuje takie zachowanie tutaj). W systemie macOS sh to bash, ale oczekiwałbym, że ich grep nie pokaże tego zachowania, ponieważ macOS ma być zgodny z POSIX, nawet bez $ POSIXLY_CORRECT. W każdym razie grep OP jest kompatybilny z GNU, ponieważ daje ten błąd.echo [!-]*
jako standardowy odpowiednik ksh (lubbash -O extglob
s)echo !(-*)
.