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
command-line
bash
find
LjinKazama
fonte
fonte
Respostas:
type
não é um comando normal. É uma concha. Vejo:Então, você precisa para invocar
bash
com-c
a alcançar o que você querOu ainda mais simples (sem necessidade
xargs
):Ele chamará
bash -c "type ./file"
, com todos os arquivos encontrados porfind
.-I
emxargs
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
: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"
.fonte
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. Vejaman bash-builtins
. Ele funciona apenas no contexto do bash, portanto não é um subshellxargs
ou-exec
bifurcado.type
está acostumado a fazer sua própria pesquisa de caminho. Se você der um caminho (comofind
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 canalxargs 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: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, poistype
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).fonte