Canalização para o comando "type"

10

Eu quero descobrir o tipo de vários comandos. É possível canalizar ou xargsum resultado de pesquisa findno typecomando no Linux?

Por exemplo:

find . -name anacron | type

ou

find . -name anacron | xargs type
LjinKazama
fonte
Eu acho que a resposta da Oli é a melhor resposta. A resposta ao caos simplesmente funciona, mas a resposta da Oli é inteligente.
Helio

Respostas:

17

typenão é um comando normal. É uma concha. Vejo:

$ type type
type is a shell builtin

Então, você precisa para invocar bashcom -ca alcançar o que você quer

$ find . -name anacron | xargs -I '{}'  bash -c "type {}"

Ou ainda mais simples (sem necessidade xargs):

$ find . -name anacron -exec bash -c "type {}"  \;

Ele chamará bash -c "type ./file", com todos os arquivos encontrados por find. -Iem xargsmeios, definimos aqui um espaço reservado {}para uso posterior. Este espaço reservado é substituído pelo nome do arquivo encontrado.

Por que shell builtins não funcionam com xargs:

Os comandos [...] internos estão contidos no próprio shell. Quando o nome de um comando interno é usado como a primeira palavra de um comando simples, o shell executa o comando diretamente, sem chamar outro programa. [...]


xargs lê itens da entrada padrão e [...] executa o comando

O comando, neste caso, é um simples escutável e um shell embutido não é um executável. Não pode ser encontrado no sistema de arquivos. Está dentro da própria concha. Portanto, você deve chamar o shell e dizer ao shell chamado para chamar o comando interno. Foi com isso que aconteceu bash -c "command".

caos
fonte
3
Você pode condensá-lo parafind ... -exec bash -c 'type "$@"' _ {} +
muru
2
@muru na verdade, eu li a minha própria resposta novamente e viu-=)
caos
11

Existem alguns problemas aqui (alguns já destacados):

  • typeé um builtin. Não é um comando resolvido, é uma função dentro do bash. Veja man bash-builtins. Ele funciona apenas no contexto do bash, portanto não é um subshell xargsou -execbifurcado.
  • typeestá acostumado a fazer sua própria pesquisa de caminho. Se você der um caminho (como findcostuma fazer), provavelmente retornará esse caminho. readlink -fpode ser melhor se você estiver apenas tentando resolver links simbólicos; e você pode entrar no canal xargs readlinkou o -exec readlink -f {} +dia inteiro.

Isso não quer dizer que você não possa fazer o que está tentando. Existem duas opções. O typecomando pode manipular muitos nomes de uma só vez, para que você possa fornecer todos os nomes de uma só vez:

type $(find /usr/sbin -name anacron)

Para muitos comandos, se houver muitos argumentos, você excederá o limite de comprimento da linha de comando (consulte getconf ARG_MAX). No entanto, isso não se aplicará neste caso, pois typeestá embutido no shell e não gera um novo ID do processo (o limite de tamanho se aplica à função exec () usada pelo processo filho em uma linha de comando normal).

Oli
fonte
1
Obrigado Oli! Este novato no Linux aprendeu algo novo hoje sobre o "tipo" e seus comportamentos.
LjinKazama