Piping para o comando “type”

10

Eu quero descobrir o tipo de vários comandos. É possível canalizar ou xargs um resultado de pesquisa de find para o comando type no Linux?

Por exemplo:

find . -name anacron | type

ou

find . -name anacron | xargs type
    
por LjinKazama 19.05.2015 / 12:03

2 respostas

17

type não é um comando normal. É um buitin de conchas. Veja:

$ type type
type is a shell builtin

Então, você precisa invocar bash com -c para conseguir o que deseja

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

Ou ainda mais simples (não é necessário usar xargs ):

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

Ele chamará bash -c "type ./file" , com todos os arquivos encontrados por find . -I in xargs significa que definimos aqui um espaço reservado {} para usar mais tarde. Este espaço reservado é substituído pelo nome de arquivo encontrado.

Por que os recursos internos do shell não funcionam com xargs :

  

Os comandos [...] internos estão contidos dentro do 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 invocar outro   programa. [...]

  

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

O comando neste caso é um simples exequível, e um shell embutido não é um executável. Não pode ser encontrado no sistema de arquivos. Está dentro da própria casca. Então você tem que chamar o shell e dizer ao shell chamado para invocar o comando interno. Isso é o que aconteceu com bash -c "command" .

    
por chaos 19.05.2015 / 12:12
11

Existem alguns problemas aqui (alguns já destacados):

  • type é um embutido. Não é um comando resolvido, é uma função dentro do bash. Veja man bash-builtins . Ele só funciona no contexto do bash, portanto, não uma subwell bifurcada xargs ou -exec .
  • type está acostumado a fazer sua própria busca de caminho. Se você der um caminho (como find costuma fazer), provavelmente retornará esse caminho. readlink -f pode ser melhor se você estiver apenas tentando resolver links simbólicos; e você pode canalizar para xargs readlink ou -exec readlink -f {} + o dia todo.

Isso não quer dizer que você não pode fazer o que está tentando. Existem duas opções. O comando type pode manipular muitos nomes de uma 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á nesse caso, pois type está embutido no shell e não gera um novo ID de processo (o limite de comprimento se aplica à função exec () usada pela criança processo em uma linha de comando normal).

    
por Oli 19.05.2015 / 12:24