Aliasing grep dalam opsi -exec find

Sep 05 2020

Saya memiliki alias ini di saya ~/.bashrc

alias grep='grep --color=auto -H'
alias fgrep='fgrep --color=auto -H'
alias egrep='egrep --color=auto -H'

tetapi tidak berpengaruh saat saya menjalankannya find ... -exec grep ..., dan saya selalu harus menyediakan opsi tersebut secara manual.

Adakah cara untuk mengetahui finduntuk mengandalkan alias dalam -execargumen opsi? Saya sedang memikirkan file konfigurasi, daripada alias lainnya.

Apakah itu tidak aman dalam beberapa hal?

Jawaban

1 Noname Sep 05 2020 at 00:15

Anda tidak dapat menggunakan alias seperti itu. Alias ​​hanya berfungsi jika digunakan pertama kali dalam urutan perintah yang panjang, shell pada dasarnya menggantikan teks alias dengan perintah sebenarnya. Saat Anda memasukkan perintah, shell pertama mencari alias, lalu fungsi, dan seterusnya. Substitusi perintah / substitusi alias tidak berfungsi jika Anda menggunakan alias di tengah urutan perintah.

Selain itu, -execbendera find, akan selalu menelurkan proses terpisah yang menjalankan biner, bukan alias, atau pun fungsi, yang diberi kode keras.

1 steeldriver Sep 05 2020 at 00:33

Beberapa shell memungkinkan alias diperluas di mana saja di baris perintah - misalnya, zshmemiliki konsep alias global ,alias -g 'grep=grep --color=auto -H'

Namun, jika shell interaktif Anda adalah bash, alias hanya diperluas ketika muncul sebagai kata pertama dari sebuah perintah, jadi Anda perlu membungkus greppanggilan dalam shell, dan memanggil shell dengan cara yang menyebabkan ~/.bashrcfile Anda dibaca, seolah-olah dalam sesi shell interaktif.

Sebagai contoh

find . -name '*.txt' -exec bash -ic 'for f do grep foo "$f"; done' find-bash {} +

AFAIK tidak berbahaya sama sekali - namun memiliki beberapa overhead dan hampir tidak lebih nyaman daripada hanya menyediakan opsi yang diinginkan untuk grep secara langsung.