Eu quero descobrir o tipo de vários comandos. É possível canalizar ou xargs
um resultado de pesquisa find
no type
comando 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 xargs
um resultado de pesquisa find
no type
comando no Linux?
Por exemplo:
find . -name anacron | type
ou
find . -name anacron | xargs type
Respostas:
type
não é um comando normal. É uma concha. Vejo:
$ type type
type is a shell builtin
Então, você precisa para invocar bash
com -c
a 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
. -I
em xargs
meios, 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 xargs
ou -exec
bifurcado.type
está acostumado a fazer sua própria pesquisa 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 entrar no canal xargs readlink
ou 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 type
comando 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 type
está 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).