Tubería para comando "tipo"


10

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

Creo que la respuesta de Oli es la mejor respuesta. La respuesta al caos simplemente funciona, pero la respuesta de Oli es inteligente.
Helio

Respuestas:


17

typeNo es un comando normal. Es una concha buitin. Ver:

$ type type
type is a shell builtin

Por lo tanto, es necesario invocar basha -clograr 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. -Ien el xargsmedio, 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".


3
Se podría condensar afind ... -exec bash -c 'type "$@"' _ {} +
Muru

2
@muru de hecho, leí mi propia respuesta nuevamente y la vi =)
caos

11

Aquí hay algunos problemas (algunos ya resaltados):

  • typeEs 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 xargso -execbifurcado.
  • typeestá acostumbrado a hacer su propia búsqueda de ruta. Si le das una ruta (como findes habitual), probablemente solo devolverá esa ruta. readlink -fpodría ser mejor si solo estás tratando de resolver enlaces simbólicos; y puedes entrar xargs 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:

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 typeestá 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).


1
Gracias Oli! Este novato de Linux ha aprendido algo nuevo hoy sobre el "tipo" y sus comportamientos.
LjinKazama
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.