Aliasing grep na opção -exec de find

Sep 05 2020

Eu tenho esses apelidos no meu ~/.bashrc

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

mas eles não têm efeito quando eu executo find ... -exec grep ...e sempre tenho que fornecer essas opções manualmente.

Existe uma maneira de contar findpara confiar em aliases nos -execargumentos da opção? Estou pensando em arquivos de configuração, em vez de outros aliases.

Seria inseguro de alguma forma?

Respostas

1 Noname Sep 05 2020 at 00:15

Você não pode usar apelidos assim. Os aliases funcionam apenas se forem usados ​​primeiro em uma longa sequência de comandos; o shell basicamente substitui o texto do alias pelo comando real. Quando você insere um comando, o shell procura primeiro um alias, depois uma função e assim por diante. A substituição de comando / substituição de alias não funciona se você estiver usando um alias no meio de uma sequência de comando.

Além disso, o -execsinalizador de find, sempre gerará um processo separado executando o binário, nem um alias, nem uma função, que é codificada.

1 steeldriver Sep 05 2020 at 00:33

Alguns shells permitem que os aliases sejam expandidos em qualquer lugar na linha de comando - por exemplo, zshtem o conceito de um alias global ,alias -g 'grep=grep --color=auto -H'

Se seu shell interativo for bash, no entanto, os aliases só serão expandidos quando aparecerem como a primeira palavra de um comando, então você precisa envolver a grepchamada em um shell e invocar o shell de uma forma que faça com que seu ~/.bashrcarquivo seja lido, como se estivesse em uma sessão de shell interativa.

Por exemplo

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

O AFAIK não é inseguro de forma alguma - no entanto, ele tem alguma sobrecarga e dificilmente é mais conveniente do que simplesmente fornecer as opções desejadas para o grep diretamente.