Penso a xargs
come la funzione di mappa della shell UNIX. Qual è la funzione filter
?Se xargs è la mappa, che cos'è il filtro?
MODIFICA: sembra che dovrò essere un po 'più esplicito.
Diciamo che devo consegnare un programma che accetta una singola stringa come parametro e restituisce con un codice di uscita di 0 o 1. Questo programma fungerà da predicato sulle stringhe che accetta.
Ad esempio, potrei decidere di interpretare il parametro stringa come percorso file e definire il predicato come "questo file esiste". In questo caso, il programma potrebbe essere test -f
, che, data una stringa, esce con 0 se il file esiste e 1 altrimenti.
Devo anche passare un flusso di stringhe. Ad esempio, potrei avere un file contenente ~/paths
/etc/apache2/apache2.conf
/foo/bar/baz
/etc/hosts
Ora, voglio creare un nuovo file, ~/existing_paths
, contenente solo i percorsi che esistono sul mio file system. Nel mio caso, che sarebbe
/etc/apache2/apache2.conf
/etc/hosts
voglio fare questo leggendo nel file ~/paths
, filtrando quelle linee dal predicato test -f
, e scrivere l'output a ~/existing_paths
. Per analogia con xargs
, questo sarà simile:
cat ~/paths | xfilter test -f > ~/existing_paths
E 'il programma ipotizzato xfilter
che sto cercando:
xfilter COMMAND [ARG]...
Il che, per ogni linea L
del suo standard input, chiamerà COMMAND [ARG]... L
e se il codice di uscita è 0, stampa L
, altrimenti non stampa nulla.
Per essere chiari, io non sono alla ricerca di:
- un modo per filtrare un elenco di filepaths dall'esistenza. Questo è stato un esempio specifico.
- come scrivere un programma del genere. Posso farlo.
ho am alla ricerca di uno:
- un'implementazione preesistente, come
xargs
o - una chiara spiegazione del perché questo non esiste
Perché non è efficace ** forcella ** Nt Imita un comando ciò che solo il filer baserà sullo stato di uscita. Come hai affermato, è semplice scrivere in qualsiasi lingua (bash, perl, C) - ma non è efficace. Molto più efficace sta usando direttamente un comando (lo strumento giusto - basato sulla situazione) che cosa potrebbe leggere _STDIN_ e _filter l'input_ come zilion volte ** fork/exec ** un comando per exit-status. Molte volte il 'xargs' non è il modo più efficace. (Immagina un elenco di file lungo 1_000_000 linee. Le forcelle Milion non sono la cosa migliore che puoi fare ...) E se hai bisogno di qualcosa del genere (come sai) è una funzione bash a 3 linee – jm666
@ jm666 suona come " efficace "intendi" performante ". Non mi importa delle prestazioni, mi interessa dell'espressività. – jameshfisher