Skip to main content

ag và tìm hoài không thấy

Nếu bạn chưa biết ag là gì thì hãy đọc ngay tại đâyag có một sức mạnh kinh hoàng mà chỉ cần một lần thử, bạn sẽ tin.

ag giúp tìm kiếm từ khoá nhanh hơn grep nhiều lần, câu lệnh ngắn hơn vài lần, và đôi khi nó còn tỏ ra thông minh một cách đáng sợ nữa.
Ví dụ dưới đây trình bày một trường hợp nếu ag trong thư mục con ``cmd`` thì tìm thấy kết quả còn nếu ag từ thư mục parent thì lại không thấy gì:
src/github.com/syncthing/syncthing/cmd $ ag cert.pem
syncthing/locations.go
47:     locCertFile:      "${config}/cert.pem",
49:     locHTTPSCertFile: "${config}/https-cert.pem",

syncthing/main.go
376:    certFile, keyFile := filepath.Join(dir, "cert.pem"), filepath.Join(dir, "key.pem")
Thấy kết quả trong file syncthing/main.go
Giờ chuyển đến thư mục parent:

src/github.com/syncthing/syncthing/cmd $ cd ..
src/github.com/syncthing/syncthing $ ag cert.pem
lib/discover/global_test.go
118:    cert, err := tlsutil.NewCertificate(dir+"/cert.pem", dir+"/key.pem", "syncthing", 1024)
190:    cert, err := tlsutil.NewCertificate(dir+"/cert.pem", dir+"/key.pem", "syncthing", 1024)

man/syncthing-config.5
60:.B \fBcert.pem\fP, \fBkey.pem\fP
64:.B \fBhttps\-cert.pem\fP, \fBhttps\-key.pem\fP

man/syncthing-device-ids.7
45:private key (\fBkey.pem\fP) and a self signed certificate (\fBcert.pem\fP). The self
99:An advanced user could replace the \fBkey.pem\fP and \fBcert.pem\fP files with a

test/cli_test.go
78:     for _, f := range []string{"home.out/config.xml", "home.out/cert.pem", "home.out/key.pem"} {
121:                            for _, f := range []string{"home.out/config.xml", "home.out/cert.pem", "home.out/key.pem", "home.out/https-cert.pem", "home.out/https-key.pem"} {

Không thấy kết quả nào trong cmd cả. Điều này đã làm mất điểm của tác giả trong một cuộc đua tìm bug :'(

Lý do? hãy cùng đi tìm!
ag có option -D để in ra output để debug.
-D --debug              Ridiculous debugging (probably not useful)
chạy từ thư mục parent:
$ ag cert.pem  -D
DEBUG: Loading ignore file ./.gitignore.
...
DEBUG: path_start ./cmd filename syncthing
DEBUG: pattern !syncthing doesn't match file syncthing
DEBUG: pattern !syncthing doesn't match file syncthing/
DEBUG: file syncthing ignored because name matches static pattern syncthing
...

Như vậy đã rõ, ag "thông minh" đọc các file .gitignore và loại bỏ chúng khỏi kết quả tìm kiếm.
Trong thư mục parent có "syncthing" trong file .gitignore, vì vậy nó bị loại khỏi kết quả tìm kiếm.

Giải pháp
khi tiếp cận repo lạ, hãy bảo syncthing không loại bỏ các kết quả nếu nó match path với các path trong .gitignore.
$ ag -a cert.pem | ag main
cmd/syncthing/main.go:376:    certFile, keyFile := filepath.Join(dir, "cert.pem"), filepath.Join(dir, "key.pem")
Giờ thì đã thấy file main.go dưới thư mục syncthing trong kết quả.
 -a --all-types          Search all files (doesn't include hidden files
                          or patterns from ignore files)
Liên quan
https://git-scm.com/docs/gitignore

Kết luận
khi dùng ag chơi ở ruộng lạ, nhớ dùng "trừ a" (-a).
Hết.
hvn at FAMILUG.org

Comments

Popular posts from this blog

Tài liệu và hướng dẫn học Python

Để tiết kiệm thời gian, tốt nhất là đi học PyMI Updated: 130617 Sau đây là các tài liệu khuyên dùng: Vì nhiều lý do, nên học python2.7 tại thời điểm hiện tại (giờ là tháng 6/2013 - muốn biết tại sao thì tự tìm hiểu) python 3.5+ (giờ là tháng 2/2017) Chuẩn bị: 1. biết bật tắt máy 2. biết cài python 3. tập gõ 10 ngón - gõ 2 ngón hay 1 ngón cũng không sao, nhưng 10 ngón là cách dễ nhất để gõ nhanh nhất. Tài liệu - Nên dùng tài liệu tại trang chủ của Python làm chính, tham khảo thêm các tài liệu khác tại http://www.familug.org/2016/12/free-ebook.html Căn bản, mới học 1.1 Python PyMI.vn https://pymi.vn/tutorial/ 1.2. Python offical tutorial kết hợp làm bài tập trên HackerRank  (đề bài bằng tiếng Anh, nhưng Google translate 1 lúc cũng ra vì có nhiều ví dụ mẫu đi kèm). Học viên của Pymi.vn có rất nhiều học viên đã tự học với Learn Python the hard way nhưng chưa thấy ai thành công cả. Hai link dưới nên đọc sau khi đã nắm được những phần cơ bản của ngôn ngữ pytho...

The PyMiers

New FAMILUG