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
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
Respostas:
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".
find ... -exec bash -c 'type "$@"' _ {} +
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).