grep hành xử khác nhau trên Fedora vs Ubuntu


13

Vì vậy, khi tôi chạy nó trong Fedora, tôi thấy điều này:

$ 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

Nhưng khi tôi chạy trên Ubuntu (cùng dữ liệu), tôi không nhận được bất kỳ kết quả nào từ 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'

Bất kỳ ý tưởng những gì có thể xảy ra? Làm thế nào tôi có thể đưa ra một cái gì đó sẽ hoạt động giống nhau trên cả hai hệ thống?


Thế còn ls *-ref.alleles?
glenn jackman

@glennjackman, tôi đã nghĩ về điều đó nhưng ai đó đã làm chính xác điều đó và nhận xét dòng đó trong tập lệnh bash tôi đang cố gắng sửa :-) Tôi chỉ có thể giả sử họ có lý do ...
Greg_the_Ant

Câu trả lời:


30
grep -F '-ref.alleles'

tương đương với:

grep -F -ref.alleles

(không có ký tự nào giữa các dấu nháy đơn là siêu ký tự shell, vì vậy trích dẫn chúng không có tác dụng.)

Điều này lần lượt tương đương với:

grep -F -r -e f.alleles

bằng cách phân tích cú pháp bình thường của các -tùy chọn tiền tố. Các -etùy chọn có một đối số, nhưng -F-rkhông.

Vì bạn không chỉ định bất kỳ tệp nào cho grep, nên hành vi mặc định là hành động trên stdin ... ngoại trừ -rtùy chọn đó không có ý nghĩa nên nó mặc định tìm kiếm .(thư mục hiện tại) theo cách đệ quy và bỏ qua stdin. Trong một số phiên bản.

Bạn cần sử dụng -- "không có thêm tùy chọn" trước khi biểu thức chính quy bắt đầu bằng -như trong

grep -F -- -ref.alleles

Tôi đã theo dõi điểm mà hành vi -rkhông có đối số tệp thay đổi. Đó là trong phiên bản 2.11, phát hành ngày 2 tháng 3 năm 2012. Xem thông báo phát hành.

Cam kết git đã ảnh hưởng đến hành vi là cái nàycái này .

Nếu bạn chạy grep --versiontrên hai máy của mình, tôi chắc chắn bạn sẽ thấy rằng một trong số chúng nằm ở phía sai của 2.11


Câu trả lời tuyệt vời, cảm ơn vì đã nghiên cứu tất cả các phiên bản nơi hành vi thay đổi.
richardneish

2
Ồ cảm ơn nhé. Bạn nói đúng, tôi đã có grep 2.6.3 so với grep 2.14.
Greg_the_Ant

6

Dẫn đầu -là vấn đề. Để có kết quả tương tự, thêm --:

grep -F -- '-ref.alleles'

Từ man bash:

A -- signals the end of options and disables further option
processing. Any arguments after the -- are treated as filenames
and arguments.

1
Tại sao nó khác nhau trên Ubuntu và Fedora? Không nên cho kết quả tiêu cực như nhau trên cả hai?
Keo dán

Cảm ơn. Nếu lệnh này được chuyển sang lệnh khác, liệu - có gây ra vấn đề gì ở đó không? Hoặc không - chỉ áp dụng cho lệnh nơi nó xuất hiện?
Greg_the_Ant

4
Trang bash man không thực sự phù hợp. Nó giải thích việc xử lý --dòng lệnh riêng của bash, độc lập với sự hiểu biết của grep --. Chúng hoạt động theo cùng một cách vì đó là quy ước chung, nhưng nói chung trang man của shell của bạn không cho bạn biết bất cứ điều gì về ý nghĩa của các đối số đối với các chương trình khác.

1

Kiểm tra .bashrc nếu có bất kỳ bí danh nào trên lệnh grep của bạn để ghi đè hành vi của nó. Có lẽ đó là vấn đề. Cũng thử grep mà không có thông số "-F".

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.