grep berlaku berbeda di Fedora vs Ubuntu

13

Jadi ketika saya menjalankan ini di Fedora saya melihat ini:

$ ls hmm_data/indivA12_AATAAG/refs/par1/
2R-orths.alleles  2R-ref.alleles
$ ls hmm_data/indivA12_AATAAG/refs/par1/ | grep -F '-ref.alleles'
2R-ref.alleles

Tetapi ketika saya menjalankan di Ubuntu (data yang sama) saya tidak mendapatkan hasil dari grep:

$ ls hmm_data/indivA12_AATAAG/refs/par1/
2R-orths.alleles  2R-ref.alleles
$ ls hmm_data/indivA12_AATAAG/refs/par1/ | grep -F '-ref.alleles'

Ada ide apa yang bisa terjadi? Bagaimana saya bisa menemukan sesuatu yang akan bekerja sama pada kedua sistem?

Greg_the_Ant
sumber
Bagaimana dengan ls *-ref.alleles?
glenn jackman
@ glennjackman, saya memikirkan hal itu tetapi seseorang melakukan hal itu dan berkomentar bahwa baris keluar dalam skrip bash saya coba untuk memperbaikinya :-) Saya hanya bisa berasumsi mereka punya alasan ...
Greg_the_Ant

Jawaban:

30
grep -F '-ref.alleles'

setara dengan:

grep -F -ref.alleles

(tidak ada karakter di antara tanda kutip yang merupakan metakarakter shell, jadi mengutipnya tidak berpengaruh.)

Ini pada gilirannya setara dengan:

grep -F -r -e f.alleles

oleh parsing normal dari -opsi yang diawali. The -epilihan membawa argumen, tetapi -Fdan -rtidak.

Karena Anda tidak menentukan file apa saja untuk di-grep, perilaku default adalah untuk bertindak pada stdin ... kecuali bahwa -ropsi itu tidak masuk akal sehingga defaultnya untuk mencari .(direktori saat ini) secara rekursif sebagai gantinya dan mengabaikan stdin. Dalam beberapa versi.

Anda perlu menggunakan --indikator "tidak ada lagi opsi" sebelum regexp yang dimulai dengan -seperti pada

grep -F -- -ref.alleles

Saya melacak titik di mana perilaku -rtanpa argumen file berubah. Itu dalam versi 2.11, dirilis 2 Maret 2012. Lihat pengumuman rilis.

Komit git yang mempengaruhi perilaku adalah ini dan ini .

Jika Anda menjalankan grep --versiondua mesin Anda, saya yakin Anda akan menemukan bahwa salah satu dari mereka berada di sisi yang salah dari 2.11


sumber
Jawaban yang bagus, terima kasih atas penelitiannya sampai ke versi di mana perilakunya berubah.
richardneish
2
Wow terima kasih. Anda benar, saya punya grep 2.6.3 vs grep 2.14.
Greg_the_Ant
6

Yang memimpin -adalah masalahnya. Untuk mendapatkan hasil yang sama tambahkan --:

grep -F -- '-ref.alleles'

Dari man bash:

A -- signals the end of options and disables further option
processing. Any arguments after the -- are treated as filenames
and arguments.
Cyrus
sumber
1
Mengapa berbeda di Ubuntu dan Fedora? Bukankah seharusnya memberikan hasil negatif yang sama pada mereka berdua?
Glueon
Terima kasih. Jika perintah ini akan disalurkan ke perintah lain, akankah - menyebabkan masalah di sana? Atau apakah - hanya berlaku untuk perintah di mana ia muncul?
Greg_the_Ant
4
Halaman bash man tidak terlalu relevan. Ini menjelaskan perlakuan --pada baris perintah bash sendiri, yang independen dari pemahaman grep --. Mereka bekerja dengan cara yang sama karena itu adalah konvensi umum, tetapi secara umum halaman manual shell Anda tidak memberi tahu Anda apa pun tentang arti argumen untuk program lain.
1

Periksa .bashrc jika ada alias pada perintah grep Anda yang mengabaikan perilaku itu. Mungkin itu masalahnya. Coba juga grep tanpa param "-F".

Glueon
sumber