Substituir o comando bash e ser capaz de passá-lo como um parâmetro para xargs

2

Gostaria de poder passar um comando grep modificado para xargs. Eu estou substituindo um comando com uma função no bash semelhante a É possível sobrescrever o comando" cd "embutido na linha de comando? . Minha função abaixo funciona, exceto ao passar para xargs. Por que isso e como eu trabalho com isso?

redefinido:

function grepc() { $(which grep) -c "$@"; }

funciona:

find -name '*.py' | grepc web
2

xargs falha:

find -name '*.py' | xargs grepc import
xargs: grepc: No such file or directory

(passando para o xargs aqui deve grep o conteúdo do arquivo da lista python, que é um estranho exemplo inventado, mas o ponto é que o xargs não consegue encontrar o grepc)

TLDR: por que o | xargs <function> não funciona? O <function> precisa realmente ser um <builtin> ou algo assim?

    
por barrrista 12.09.2017 / 03:00

2 respostas

4

Qualquer que seja o xargs , ele é seu processo filho direto, não há shell entre eles. xargs não tem noção de sua função. Também não tem conceito de builtins de shell.

Para que funcione:

  • ou exporte sua função (com export -f grepc ) e faça xargs executar um shell de uma maneira um pouco complicada: … | xargs bash -c 'grepc "$@"' bash
  • ou melhor converta sua função em um script, torne o arquivo executável e coloque-o onde seu $PATH aponta (ou ajuste a variável); então grepc será um arquivo e xargs poderá executá-lo.
por 12.09.2017 / 06:36
0

Outra solução que me ocorreu:

alias xg='xargs grep --color <or whatever else I want>'

Desde que eu uso essa combinação com tanta frequência.

    
por 13.09.2017 / 19:52

Tags