Piping al comando "type"


10

Voglio scoprire il tipo di diversi comandi. È possibile eseguire il pipe o xargsun risultato di ricerca findnel typecomando in Linux?

Per esempio:

find . -name anacron | type

o

find . -name anacron | xargs type

Penso che la risposta di Oli sia la risposta migliore. La risposta al caos funziona, ma la risposta di Oli è intelligente.
Helio,

Risposte:


17

typenon è un comando normale. È un acquisto di conchiglie. Vedere:

$ type type
type is a shell builtin

Quindi, è necessario invocare bashcon -cper ottenere ciò che si desidera

$ find . -name anacron | xargs -I '{}'  bash -c "type {}"

O ancora più semplice (non è necessario xargs):

$ find . -name anacron -exec bash -c "type {}"  \;

Chiamerà bash -c "type ./file", con ogni file trovato da find. -Iin xargsmezzo, definiamo qui un segnaposto {}da utilizzare in seguito. Questo segnaposto viene sostituito con il nome file trovato.

Perché i builtin della shell non funzionano con xargs:

[...] I comandi integrati sono contenuti nella shell stessa. Quando il nome di un comando incorporato viene utilizzato come prima parola di un comando semplice, la shell esegue il comando direttamente, senza richiamare un altro programma. [...]


xargs legge gli elementi dallo standard input, [...] ed esegue il comando

Il comando in questo caso è un semplice eseguibile e un built-in della shell non è un eseguibile. Non può essere trovato nel filesystem. È all'interno del guscio stesso. Quindi devi chiamare la shell e dire alla shell chiamata di invocare il comando incorporato. Ecco cosa è successo bash -c "command".


3
Potresti condensarlo afind ... -exec bash -c 'type "$@"' _ {} +
Muru,

2
@muru in effetti, ho letto di nuovo la mia risposta e l'ho vista =)
caos

11

Ci sono alcuni problemi qui (alcuni già evidenziati):

  • typeè incorporato. Non è un comando che è stato risolto, è una funzione all'interno di bash. Vedere man bash-builtins. Funziona solo nel contesto di bash in modo non un xargso -execsubshell biforcuta.
  • typeè abituato a fare il proprio percorso di ricerca. Se gli dai un percorso (come findè solito fare), probabilmente restituirà quel percorso. readlink -fpotrebbe essere migliore se stai solo cercando di risolvere i collegamenti simbolici; e puoi convogliare xargs readlinko per -exec readlink -f {} +tutto il giorno.

Questo non vuol dire che non puoi fare quello che stai cercando. Vi sono due opzioni. Il typecomando può gestire più nomi contemporaneamente in modo da poterlo fornire tutti i nomi contemporaneamente:

type $(find /usr/sbin -name anacron)

Per molti comandi, se ci sono troppi argomenti supererai il limite di lunghezza della riga di comando (vedi getconf ARG_MAX). Tuttavia, ciò non si applica in questo caso poiché typeè incorporato nella shell e non genera un nuovo ID processo (il limite di lunghezza si applica alla funzione exec () utilizzata dal processo figlio in una normale riga di comando).


1
Grazie Oli! Questo principiante di Linux ha imparato qualcosa di nuovo oggi riguardo al "tipo" e ai suoi comportamenti.
LjinKazama,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.