Aliasing grep in find's -exec option
Tôi có những bí danh này trong ~/.bashrc
alias grep='grep --color=auto -H'
alias fgrep='fgrep --color=auto -H'
alias egrep='egrep --color=auto -H'
nhưng chúng không có hiệu lực khi tôi chạy find ... -exec grep ...và tôi luôn phải cung cấp các tùy chọn đó theo cách thủ công.
Có cách nào để nói findlà dựa vào bí danh trong các -execđối số của tùy chọn không? Tôi đang nghĩ đến các tệp cấu hình, thay vì các bí danh khác.
Nó sẽ không an toàn theo một cách nào đó?
Trả lời
Bạn không thể sử dụng bí danh như vậy. Bí danh chỉ hoạt động nếu chúng được sử dụng đầu tiên trong một chuỗi lệnh dài, về cơ bản, shell sẽ thay thế văn bản bí danh bằng lệnh thực. Khi bạn nhập một lệnh, đầu tiên shell sẽ tìm kiếm một bí danh, sau đó là một hàm, v.v. Thay thế lệnh / thay thế bí danh không hoạt động nếu bạn đang sử dụng bí danh ở giữa chuỗi lệnh.
Hơn nữa, -execcờ của find, sẽ luôn sinh ra một quá trình riêng biệt thực hiện nhị phân, không phải là bí danh hay hàm, được mã hóa cứng.
Một số shell cho phép mở rộng bí danh ở bất kỳ đâu trong dòng lệnh - ví dụ: zshcó khái niệm về bí danh chung ,alias -g 'grep=grep --color=auto -H'
Tuy nhiên, nếu trình bao tương tác của bạn là bash, các bí danh chỉ được mở rộng khi chúng xuất hiện dưới dạng từ đầu tiên của lệnh, vì vậy bạn sẽ cần phải gói greplời gọi trong một trình bao và gọi trình bao theo cách khiến ~/.bashrctệp của bạn được đọc, như thể trong một phiên trình bao tương tác.
Ví dụ
find . -name '*.txt' -exec bash -ic 'for f do grep foo "$f"; done' find-bash {} +
AFAIK nó không phải là không an toàn theo bất kỳ cách nào - tuy nhiên nó có một số chi phí và hầu như không thuận tiện hơn chỉ đơn giản là cung cấp các tùy chọn mong muốn để grep trực tiếp.