I comandi di ausilio per la redirezione

()

Nonostante la grande flessibilita degli operatori di redirezione della shell, esistono situazioni in cui il loro uso non e suffciente a fornire le funzionalità necessarie, per questo esistono dei comandi che permettono di estendere l’uso della redirezione.

Ad esempio uno dei fraintendimenti piu comuni riguardo l’uso della concatenazione dei comandi e quello in cui si pensa di usare la pipe per passare come argomenti ad un comando successivo l’output di un comando precedente. Questo non e ovviamente possibile perchè l’uso di una pipe consente solo di passare lo standard output di un comando sullo standard input del successivo, e non ha nulla a che fare con gli argomenti di quest’ultimo.

Si ricordi infatti che gli argomenti provengono dall’analisi che fa la shell dalla linea di comando, spezzandola in parole, e che vengono passati in fase di messa in esecuzione di un programma, operazione che non ha nulla a che fare con la lettura, che avviene sempre a cura del comando stesso, dei dati presenti sullo standard input.

E’ pero possibile fornire questa funzionalità con l’uso del comando xargs, il cui compito e replicare il comportamento della shell, che legge la linea di comando e ne estrae gli argomenti per poi passarli al comando che invoca. Il comando cioè effettua la lettura dello standard input e ne ricava una lista di argomenti da passare ad un successivo comando, in questo modo diventa possibile ricevere gli argomenti dall’output di un comando precedente tramite una pipe.

Il comando xargs prende come primo argomento il nome del comando da eseguire e come ulteriori argomenti le eventuali opzioni o argomenti iniziali da passare allo stesso. Il comando viene poi eseguito passandogli una lista di ulteriori argomenti, ottenuta dalla scansione dello standard input utilizzando gli spazi e gli a capo come separatori. E possibile proteggere la presenza di spazi all’interno degli argomenti come si fa con la shell, usando le virgolette o la barra trasversa. Se non si speci ca nessun comando da eseguire, di default viene usato echo.

In questo modo se si ha una lista di le (o si e in grado di generarla) diventa possibile applicare a ciascun le della lista un comando qualunque usando semplicemente cat e xargs. Se cioe si vogliono cancellare tutti i le contenuti nel le lista, si potra usare un comando del tipo:

cat lista | xargs rm -f

se invece li si vogliono copiare in una directory si potra usare:

cat lista | xargs cp -t dir

ovviamente nel far questo occorrera stare molto attenti, e sempre consigliabile infatti, quando si usa xargs, lanciare il comando senza argomenti per verificare che non si stiano facendo degli errori.

Il comando permette di impostare, con l’opzione -E una stringa da usare come marcatore per la ne del le, in modo da ignorare tutto quanto sar ottenuto dopo. Con l’opzione -t permette inoltre di stampare a video il comando che verra eseguito, e con -p di richiedere conferma dell’esecuzione sul terminale. In ne l’opzione -0 richiede che quanto letto sullo standard input sia interpretato come stringhe terminate da uno zero (il carattere NUL), cos da poter interpretare letteralmente i vari caratteri, in modo da non dover trattare in maniera speciale spazi, virgolette, ecc.

Questo consente di risolvere i problemi che si hanno quando si deve operare con find su dei le che hanno degli spazi o altri caratteri interpretati dalla shell nel nome; combinando l’opzione -0 di xargs con l’opzione -print0 di find si potranno trattare anche i nomi piu complicati.

Si tenga presente che i due esempi precedenti per l’uso di xargs funzionano regolarmente perchè i comandi utilizzati accettano come argomenti una lista di file, quando pero si vogliono fare delle operazioni più complesse (ad esempio rinominare dei le sulla base di una elaborazione del loro nome) ci si trova di fronte al problema che programmi come mv si aspettano di avere due argomenti e non una lista. In questo caso ci viene incontro una delle caratteristiche piu interessanti di xargs, che e quella di poter eseguire invocazioni multiple dello stesso comando. Con l’opzione -n infatti si

può indicare il numero massimo di argomenti (sempre presi dalla lista ottenuta dalla scansione dello standard input) da passare a ciascuna invocazione, se si ricevono piu argomenti i successivi saranno utilizzati per un’altra invocazione.

Se invece gli argomenti gia sono suddivisi per linee, si puo usare l’opzione -L che consente di indicare quante linee dello standard input utilizzare per ciascuna invocazione del comando. Così se volessimo rinominare tutti i le .tex di questo testo aggiungendo un _new al rispettivo nome potremmo usare qualcosa del tipo:

ls *.tex | sed -r -e ’s/(.*)(.tex)/\1\2 \1_new\2/g’ | xargs -L1 mv

Si sono riassunte le principali opzioni di xargs l’elenco completo delle opzioni ed una descrizione dettagliata del comando si possono trovare come sempre consultando la pagina di manuale, accessibile con man xargs.


Opzione
 Signi cato
   
-a file indica di leggere gli argomenti dal  le file  anziche dallo
  standard input.
-E str indica la stringa str da considerare come  ne del  le, cos
  da scartare tutto quello che segue, sostituisce nello standard
  POSIX l’opzione -e (tutt’ora presente) che ha lo stesso e etto.
-n N usa al massimo N  argomenti per ciascuna invocazione del
  comando.
-L N usa un massimo di N  linee come argomenti per ciascuna
  invocazione del comando.
-p richiede conferma sul terminale prima di eseguire un comando.
-t aumenta la prolissita del comando.
-r non esegue nessun comando se non si ha niente in ingresso.
-0 richiede la terminazione dei singoli argomenti con un carattere
  nullo al posto dei normali spazi e disabilita l’interpretazione
  dei caratteri speciali.
 Tabella 2.37: Principali opzioni del comando xargs.

Un secondo comando di ausilio per la redirezione è tee. Il suo scopo principale e quello di permettere di salvare su un le un risultato intermedio all’interno di una catena di redirezioni.

In tal caso infatti l’uscita di un comando viene inviata sulla pipe e letta dal comando successivo, perdendo così la possibilitè di esaminarla direttamente.

L’idea che sta alla base di tee, indicata dal suo stesso nome, e quella di creare una sorta di percorso a T nel usso di dati della catena di redirezioni, in cui questi da una parte proseguono verso il comando successivo e dall’altra vengono salvati su un le. Questo signi ca che la maniera piu comune di utilizzare tee sar qualcosa nella forma:

cmd1 | tee result | cmd2

che consente di scrivere il risultato di cmd1 sul le result ed al contempo inviarlo in pipe a cmd2 per una ulteriore elaborazione. Alternativamente si puo usare il comando in coda ad una catena di redirezioni per salvare il risultato ed allo stesso tempo visualizzarlo sullo schermo. L’uso di tee infatti permette di effettuare una sorta di redirezione in background, in cui quello che il comando legge dallo standard input viene scritto sia sul le passato come argomento che sullo standard output. Il comando, come nella normale redirezione dello standard output, e anche in grado di eseguire la scrittura del le speci cato in append, se invocato con l’opzione -a. Al solito per tutti i dettagli di funzionamento e l’elenco completo delle opzioni si consulti la pagina di manuale.

Un ultimo comando usato come ausilio per la redirezione e yes, che ha il semplice compito (se invocato senza argomenti) di scrivere continuamente sullo standard input una serie di y. Anche in questo caso l’utilità di fare un comando per un compito cos speci co diventa evidente solo considerando la capacit della shell di concatenare i comandi, per cui si può usare yes per pilotare automaticamente lo standard input di un comando che richiede conferme (come potrebbe essere rm -i). Il comando non ha nessuna opzione speci ca e prende come argomento opzionale una stringa, che se indicata viene scritta sullo standard input al posto di y.

/ 5
Grazie per aver votato!

How useful was this post?

Click on a star to rate it!

Average rating / 5. Vote count:

No votes so far! Be the first to rate this post.

As you found this post useful...

Follow us on social media!

We are sorry that this post was not useful for you!

Let us improve this post!

Tell us how we can improve this post?