Quiero averiguar el tipo de varios comandos. ¿Es posible canalizar o xargs
un resultado de búsqueda desde find
el type
comando en Linux?
Por ejemplo:
find . -name anacron | type
o
find . -name anacron | xargs type
Quiero averiguar el tipo de varios comandos. ¿Es posible canalizar o xargs
un resultado de búsqueda desde find
el type
comando en Linux?
Por ejemplo:
find . -name anacron | type
o
find . -name anacron | xargs type
Respuestas:
type
No es un comando normal. Es una concha buitin. Ver:
$ type type
type is a shell builtin
Por lo tanto, es necesario invocar bash
a -c
lograr lo que quiere
$ find . -name anacron | xargs -I '{}' bash -c "type {}"
O incluso más simple (no es necesario xargs
):
$ find . -name anacron -exec bash -c "type {}" \;
Llamará bash -c "type ./file"
, con cada archivo que encuentre find
. -I
en el xargs
medio, 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
:
[...] Los comandos incorporados están contenidos dentro del propio shell. Cuando se utiliza el nombre de un comando incorporado como la primera palabra de un comando simple, el shell ejecuta el comando directamente, sin invocar otro programa. [...]
xargs lee elementos de la entrada estándar, [...] y ejecuta el comando
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"
.
find ... -exec bash -c 'type "$@"' _ {} +
Aquí hay algunos problemas (algunos ya resaltados):
type
Es un incorporado. No es un comando resuelto, es una función dentro de bash. Ver man bash-builtins
. Solo funciona en el contexto de bash, por lo que no es un subshell bifurcado xargs
o -exec
bifurcado.type
está acostumbrado a hacer su propia búsqueda de ruta. Si le das una ruta (como find
es habitual), probablemente solo devolverá esa ruta. readlink -f
podría ser mejor si solo estás tratando de resolver enlaces simbólicos; y puedes entrar xargs readlink
o -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 type
comando puede manejar muchos nombres a la vez, por lo que puede proporcionarle todos los nombres a la vez:
type $(find /usr/sbin -name anacron)
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 que type
está 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).