Voglio scoprire il tipo di diversi comandi. È possibile eseguire il pipe o xargs
un risultato di ricerca find
nel type
comando in Linux?
Per esempio:
find . -name anacron | type
o
find . -name anacron | xargs type
Voglio scoprire il tipo di diversi comandi. È possibile eseguire il pipe o xargs
un risultato di ricerca find
nel type
comando in Linux?
Per esempio:
find . -name anacron | type
o
find . -name anacron | xargs type
Risposte:
type
non è un comando normale. È un acquisto di conchiglie. Vedere:
$ type type
type is a shell builtin
Quindi, è necessario invocare bash
con -c
per 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
. -I
in xargs
mezzo, 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"
.
find ... -exec bash -c 'type "$@"' _ {} +
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 xargs
o -exec
subshell biforcuta.type
è abituato a fare il proprio percorso di ricerca. Se gli dai un percorso (come find
è solito fare), probabilmente restituirà quel percorso. readlink -f
potrebbe essere migliore se stai solo cercando di risolvere i collegamenti simbolici; e puoi convogliare xargs readlink
o per -exec readlink -f {} +
tutto il giorno.Questo non vuol dire che non puoi fare quello che stai cercando. Vi sono due opzioni. Il type
comando 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).