Michele Liberi software

versione 1.03, 1 settembre 2022

Michele Liberi
mail: mliberi@gmail.com
cell: 3485211456

liberix

yargs, esecuzione multipla di un comando

Il comando yargs è una versione migliorata del comando UNIX xargs.

L'esistenza del comando standard xargs nasce dal fatto che una singola linea di comando ha una lunghezza massima (ARG_MAX) quindi l'espansione delle wildcards da parte della shell talvolta fallisce.

Ad esempio il comando wc -l * produce in output il numero di righe contenuto in ogni file nella directory corrente. Va tutto bene se il numero di files è piccolo, ma al crescere del numero di files il comando potrebbe fallire perché l'espansione del carattere '*' fa crescere la lunghezza della linea di comando oltre il limite massimo.

La soluzione semplice ed immediata:

for f in *
do
  wc -l "$f"
done
è molto inefficiente perché il comando wc -l viene lanciato per ogni file, con tempi di esecuzione lentissimi, in quanto la generazione di un nuovo sottoprocesso (fork()+exec()) è un'operazione lenta ed inefficiente.

Per mantenere il processo efficiente, ed al contempo rendere "infallibile" il comando, lo standard UNIX prevede di usare ls |xargs wc -l il quale legge i nomi dei files da processare da standard input e lancia il wc -l più volte, facendo attenzione di non eccedere mai la dimensione massima della riga di comando, minimizzando così il numero di sottoprocessi generati.

C'è solo un piccolo problema: il comando xargs parte dal presupposto che un nome di file non possa contenere spazi, cosa invero alquanto frequente nei sistemi moderni.

Il comando yargs risolve questo problema considerando l'intera linea come nome di file e non le singole parole in essa contenute.

A questo punto il comando veramente infallibile diventa ls |yargs wc -l.

Per ulteriori informazioni sulle opzioni disponibili lanciare il comando yargs -h.