Hack per la shell

Da Wiki di NetBSD Italia.

(Differenze fra le revisioni)
m (Bot: Sostituzione automatica (-o'([^']|$) +ò\1))
m (Bot: Sostituzione automatica (-u'([^']|$) +ù\1))
 
Riga 11: Riga 11:
== Trovare un pacchetto ==
== Trovare un pacchetto ==
-
Piccolo accorgimento che emula la funzione di ricerca base del famigerato {{man|pkgfind|1}}. Le uniche differenze significative sono il fatto che quest'ultimo, oltre ad essere decisamente piu' lento (dato che effettua una "vera" ricerca, anzichè sfruttare il meccanismo di ''globbing'') non mostra i cosiddetti ''distfiles'' contenuti nella directory ''pkgsrc/distfiles''. A suo favore, invece, c'è la capacità i distinguere fra maiuscole e minuscole (al prezzo dell'installazione di un pacchetto, ''pkgtools/pkgfind'', appunto). Di seguito sono riportate le versioni per le shell piu' diffuse le quali di norma vanno inserite nel relativo file di inizializzazione dell'interprete:
+
Piccolo accorgimento che emula la funzione di ricerca base del famigerato {{man|pkgfind|1}}. Le uniche differenze significative sono il fatto che quest'ultimo, oltre ad essere decisamente più lento (dato che effettua una "vera" ricerca, anzichè sfruttare il meccanismo di ''globbing'') non mostra i cosiddetti ''distfiles'' contenuti nella directory ''pkgsrc/distfiles''. A suo favore, invece, c'è la capacità i distinguere fra maiuscole e minuscole (al prezzo dell'installazione di un pacchetto, ''pkgtools/pkgfind'', appunto). Di seguito sono riportate le versioni per le shell più diffuse le quali di norma vanno inserite nel relativo file di inizializzazione dell'interprete:
* {{man|sh|1}} (e shell Bourne in generale)
* {{man|sh|1}} (e shell Bourne in generale)

Versione corrente delle 21:27, 29 mar 2008

Raccolta di hack, fantasie e virtusismi per la shell :-) Tutti i membri della comunità sono invitati a contribuire all'evoluzione di questa pagina lasciando, come una firma digitale personalizzata dallo stile e dall'originalità, il proprio script.

Indice

Micro-pause

Questo comando riproduce, ogni 10 minuti, 5 beep a distanza di 1 secondo ciascuno utilizzando la campanella di sistema.

$ while true ; do sleep 600 ; for i in $(seq 1 5) ; do \
printf '\à  sleep 1 ; done ; done

L'obiettivo è ricordarsi di effettuare delle micro-pause periodiche per allentare le tensioni muscolari. Un vero software indicato per questo genere di attività è wip/workrave.

Trovare un pacchetto

Piccolo accorgimento che emula la funzione di ricerca base del famigerato pkgfind(1). Le uniche differenze significative sono il fatto che quest'ultimo, oltre ad essere decisamente più lento (dato che effettua una "vera" ricerca, anzichè sfruttare il meccanismo di globbing) non mostra i cosiddetti distfiles contenuti nella directory pkgsrc/distfiles. A suo favore, invece, c'è la capacità i distinguere fra maiuscole e minuscole (al prezzo dell'installazione di un pacchetto, pkgtools/pkgfind, appunto). Di seguito sono riportate le versioni per le shell più diffuse le quali di norma vanno inserite nel relativo file di inizializzazione dell'interprete:

  • sh(1) (e shell Bourne in generale)
$ pkgdir() { ls -1d /usr/pkgsrc/*/$1 |cut -d'/' -f4-; }
% alias pkgdir 'ls -1d /usr/pkgsrc/*/\!^ |cut -d'/' -f 4-'

NOTA: csh è l'unica shell che supporta gli argomenti per gli alias, motivo per cui, al fine di ottenere lo stesso comportamento, l'unica soluzione è quella di utilizzare le funzioni.

Qualche esempio:

  • Match preciso
$ pkgdir firefox
www/firefox
  • Con wildcard
$ pkgdir firefox*bin
www/firefox-bin
www/firefox15-bin

Installare un pacchetto in modalità silenziosa

Questo semplice comando consente di installare un pacchetto visualizzando su schermo solo i messaggi dell'infrastruttura di pkgsrc escludendo tutti quelli legati alla compilazione del pacchetto o al fetching dei sorgenti. Per eventuali errori o altro è possibile consultare l'output completo del processo di installazione all'interno del file full.out, creato all'interno della directory corrente.

$ make 2>&1 | tee full.out |grep ^=

Per sopprimere totalmente l'output usare invece il seguente comando:

$ make 2>&1 > full.out

Greppare i Makefile pkgsrc

Con la seguente funzione è possibile utilizzare grep(1) (e le sue opzioni) su tutti i Makefile di pkgsrc. Risulta piuttosto utile sia per maintainer che vogliono curiosare qualche variabile che per utenti:

$ pkggrep() { for i in `find /usr/pkgsrc/ -mindepth 1 -maxdepth 1 -type d`; \
{ grep -s $* ${i}/*/Makefile ; } }

Possiamo utilizzarlo in molti ambiti, ad esempio se vogliamo trovare tutti i pacchetti mantenuti da un certo maintainer:

$ pkggrep -lE "MAINTAINER.+hubertf"
/usr/pkgsrc/audio/cam/Makefile
/usr/pkgsrc/audio/gqmpeg-skins/Makefile
/usr/pkgsrc/net/hf6to4/Makefile
[...]

Coltellino svizzero per l'audio con MPlayer

Questa piccola e semplice funzione consente di convertire da/a un qualsiasi tipo di formato audio supportato da MPlayer (ovvero di cui esista un codec).

amv() {
   mplayer -ao pcm:file="$2" "$1"
}

Ad esempio, per convertire il file test.wav in OGG Vorbis basta eseguire il seguente comando:

$ amv test.wav test.ogg

Inutile a dirsi, bisogna avere MPlayer installato.

man2elinks - Uno per tutti

Con questa funzione è possibile far convergere tutte le pagine di manuale aperte su ELinks, in modo tale da poterle consultare su un unico terminale o client X.

eman() {
   tmpfile=$(mktemp -t elinks.man.XXXXX)
   man -P  $* > $tmpfile 2>&- && elinks -remote $tmpfile
   rm $tmpfile
}

Il comando funziona esattamente come man(1) ad eccezione del fatto che muove la pagina di manuale su ELinks:

$ eman security

Oppure, dal momento che tutta riga viene passata a man(1):

$ eman 2 write

NOTA: il browser web dev'essere configurato appositamente al fine di poter gestire correttamente le pagine di manuale (in questo caso semplici documenti di testo ASCII - MIME: plain/text).

cmd2elinks - Uno per tutti (generico)

Versione generalizzata della funzione eman che invia a ELinks l'output di un comando qualsiasi anzichè solo una pagina di manuale. Essendo quasi identica alla suddetta funzione non mi dilungherò oltre nella spiegazione:

ecmd() {
   tmpfile=$(mktemp -t elinks.cmd.XXXXX)
   $* 2>&- > $tmpfile && elinks -remote $tmpfile
   rm $tmpfile
}

In questo modo è possibile eseguire, ad esempio, comandi del tipo:

$ ecmd nroff -man manpage.1 

consultando i risultati direttamente su una sessione ELinks eventualmente aperta in precedenza.

Strumenti personali