Quiero averiguar el tipo de varios comandos. ¿Es posible canalizar o xargsun resultado de búsqueda desde findel typecomando en Linux?
Por ejemplo:
find . -name anacron | type
o
find . -name anacron | xargs type
command-line
bash
find
LjinKazama
fuente
fuente

Respuestas:
typeNo es un comando normal. Es una concha buitin. Ver:Por lo tanto, es necesario invocar
basha-clograr lo que quiereO incluso más simple (no es necesario
xargs):Llamará
bash -c "type ./file", con cada archivo que encuentrefind.-Ien elxargsmedio, definimos aquí un marcador{}de posición para usar más adelante. Este marcador de posición se reemplaza con el nombre de archivo encontrado.¿Por qué las construcciones de conchas no funcionan con
xargs:El comando en este caso es un simple ejecutable, y un shell incorporado no es un ejecutable. No se puede encontrar en el sistema de archivos. Está dentro del caparazón mismo. Entonces debe llamar al shell y decirle al shell llamado que invoque el comando incorporado. Eso es lo que sucedió
bash -c "command".fuente
find ... -exec bash -c 'type "$@"' _ {} +Aquí hay algunos problemas (algunos ya resaltados):
typeEs un incorporado. No es un comando resuelto, es una función dentro de bash. Verman bash-builtins. Solo funciona en el contexto de bash, por lo que no es un subshell bifurcadoxargso-execbifurcado.typeestá acostumbrado a hacer su propia búsqueda de ruta. Si le das una ruta (comofindes habitual), probablemente solo devolverá esa ruta.readlink -fpodría ser mejor si solo estás tratando de resolver enlaces simbólicos; y puedes entrarxargs readlinko-exec readlink -f {} +todo el día.Eso no quiere decir que no puedes hacer lo que estás tratando de hacer. Hay dos opciones El
typecomando puede manejar muchos nombres a la vez, por lo que puede proporcionarle todos los nombres a la vez:Para muchos comandos, si hay demasiados argumentos, excederá el límite de longitud de la línea de comando (ver
getconf ARG_MAX). Sin embargo, eso no se aplicará en este caso, ya quetypeestá integrado en el shell y no genera una nueva ID de proceso (el límite de longitud se aplica a la función exec () utilizada por el proceso secundario en una línea de comando normal).fuente