Saya mencoba mencari string secara rekursif grep
tetapi saya mendapatkan ini:
$ grep -r "stuff" *
grep: unrecognized option '---corporate-discount.csv'
Usage: grep [OPTION]... PATTERN [FILE]...
Try 'grep --help' for more information.
Bagaimana saya bisa mencegah Bash agar tidak meneruskan file yang dimulai dengan -
sebagai argumen?
grep
bahwa itu bukan pilihan.subprocess.Popen(['grep', '-r', '-e' 'stuff', '--corporate-discount.csv'])
dengan Python, tidak ada bash di mana pun.*
perintah. SEMUA ini bisa dihindari dengan menggunakan./*
sebagai gantinya.--
sigil sebagai opsi akhir juga sangat masuk akal; Pedoman sintaks utilitas POSIX mengharuskannya dihormati; lihat pedoman # 10. (Tentu, tidak semua program mengikuti pedoman POSIX, tetapi jawabannya adalah untuk merangkai penulis program yang menyinggung dan / atau mengeluarkan mereka dari industri).Jawaban:
Pertama, perhatikan bahwa interpretasi argumen yang dimulai dengan tanda hubung tergantung pada program yang sedang dijalankan,
grep
atau lainnya. Shell tidak memiliki cara langsung untuk mengendalikannya.Dengan asumsi Anda ingin memproses file seperti itu (dan tidak mengabaikannya sama sekali)
grep
, bersama dengan sebagian besar program, dikenali--
sebagai indikasi akhir dari opsi, jadiakan melakukan apa yang Anda inginkan. Apakah
-e
ada dalam kasusstuff
dimulai dengan-
juga.Atau, Anda juga dapat menggunakan:
Yang terakhir itu juga akan menghindari masalah jika ada file yang dipanggil
-
di direktori saat ini. Bahkan setelah--
pemisah,grep
diartikan-
sebagai makna stdin, sementara itu./-
adalah file yang disebut-
dalam direktori saat ini.sumber
Untuk mencegah ekspansi Bash dari meneruskan file yang dimulai dengan "-" Anda dapat menggunakan:
Yang bekerja dengan baik di sebagian besar shell, atau, khusus untuk ksh, bash, zsh:
Misalnya: dalam direktori dengan file ini
Hanya akan daftar (asalkan
extglob
aktif):Tetapi jika yang Anda inginkan adalah memroses semua file sambil memberi tahu grep untuk menghindari menafsirkan file yang dinyatakan dengan
-
opsi sebagai, maka tambahkan saja./
:Atau, jika ada jaminan bahwa tidak ada file yang dipanggil persis
-
ada dalam file yang terdaftar (grep akan mengartikan kesepian-
sebagai dibaca dari stdin ), Anda dapat menggunakan:sumber
grep -r -- stuff *
lebih sederhana, dan bekerja dengan greps non-GNUish juga. Jadi: tambah, terima kasih. @ StéphaneChazelasgrep
pada FreeBSD masih berbasis pada GNUgrep
dan masih memiliki kesalahan di mana opsi dikenali setelah tidak ada opsi. Bahkan BSD seperti OpenBSD yang telah menulis ulanggrep
membuat mereka GNU kompatibel untuk portabilitas terbalik (dan masih menunjukkan perilaku itu di sini). Pada macOS, sh adalah bash, tapi saya berharap grep mereka tidak menunjukkan perilaku seperti macOS yang dimaksudkan untuk menjadi POSIX bahkan tanpa $ POSIXLY_CORRECT. Dalam kasus apapun, grep OP adalah GNU-kompatibel karena memberikan kesalahan itu.echo [!-]*
sebagai standar yang setara dengan ksh (ataubash -O extglob
's)echo !(-*)
.