<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Mia mamma usa Linux! &#187; Comandi poco conosciuti</title>
	<atom:link href="http://www.miamammausalinux.org/tag/comandi-poco-conosciuti/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.miamammausalinux.org</link>
	<description>Perché niente è impossibile da capire... Se lo spieghi bene !</description>
	<lastBuildDate>Mon, 02 Jan 2012 11:31:44 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Linux e la linea di comando, comandi particolari e poco conosciuti: gestione delle code di stampa</title>
		<link>http://www.miamammausalinux.org/2009/12/linux-e-la-linea-di-comando-comandi-particolari-e-poco-conosciuti-gestione-delle-code-di-stampa/</link>
		<comments>http://www.miamammausalinux.org/2009/12/linux-e-la-linea-di-comando-comandi-particolari-e-poco-conosciuti-gestione-delle-code-di-stampa/#comments</comments>
		<pubDate>Thu, 03 Dec 2009 10:53:25 +0000</pubDate>
		<dc:creator>Raoul Scarazzini</dc:creator>
				<category><![CDATA[Bash]]></category>
		<category><![CDATA[Sistema]]></category>
		<category><![CDATA[Comandi per la stampa]]></category>
		<category><![CDATA[Comandi poco conosciuti]]></category>
		<category><![CDATA[CUPS]]></category>
		<category><![CDATA[Linea di comando]]></category>
		<category><![CDATA[Manipolazione file di testo]]></category>
		<category><![CDATA[Stampanti]]></category>

		<guid isPermaLink="false">http://www.miamammausalinux.org/?p=883</guid>
		<description><![CDATA[Dopo aver affrontato i comandi interni alla shell Bash ed i comandi di sistema richiamabili all&#8217;interno dalla stessa per la manipolazione degli stream di output e dei contenuti dei file in questo articolo verranno trattati i comandi per la gestione delle code di stampa. Verranno illustrati i comandi per inviare un file direttamente alla stampante, [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.miamammausalinux.org/wp-content/uploads/2009/01/linux.png" alt="linux" title="linux" width="85" height="100" class="alignnone size-full wp-image-292" /></p>
<p>Dopo aver affrontato i comandi interni alla shell Bash ed i comandi di sistema richiamabili all&#8217;interno dalla stessa per la manipolazione degli stream di output e dei contenuti dei file in questo articolo verranno trattati i comandi per la gestione delle code di stampa.<br />
Verranno illustrati i comandi per inviare un file direttamente alla stampante, analizzare la coda di stampa e rimuovere lavori in coda.</p>
<p>I comandi per operare sulle code di stampa nei sistemi Linux moderni sono forniti dal pacchetto del server di posta <a href="http://www.cups.org/">CUPS</a>. CUPS fornisce un set di comandi retro compatibili al precedente gestore della posta Linux, <a href="http://en.wikipedia.org/wiki/Line_Printer_Daemon_protocol">LPD</a>: questo significa che il nome degli stessi è stato mantenuto identico in modo da favorire l&#8217;integrazione di CUPS con i programmi che fanno riferimento a comandi di sistema come <em>lpstat</em>, <em>lpq</em> e così via.<br />
Sebbene CUPS di default renda disponibile un&#8217;interfaccia web alla porta 631, alla quale si può accedere con il proprio browser, molte volte potrebbe essere necessario utilizzare la linea di comando per operare sulle code di stampa. I comandi che consentono tali operazioni si dividono in comandi che richiedono i permessi dell&#8217;utente root ed in comandi utilizzabili da utenti non privilegiati.</p>
<p><strong>Informazioni sulle stampanti (utente root)</strong></p>
<p><strong><em>lpstat</em></strong></p>
<p>Capire quali sono le code configurate all&#8217;interno del sistema è il primo passo per iniziare ad operare all&#8217;interno delle stesse.<br />
Il comando <em>lpstat</em> consente di visualizzare diverse informazioni sulle stampanti installate all&#8217;interno del sistema, ad esempio attraverso l&#8217;opzione &#8220;-p&#8221; il comando restituisce l&#8217;elenco delle stampanti:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;"># lpstat -p
la stampante Brother-HL-4040CN è in attesa.  Abilitata da gio 19 nov 2009 18:23:32 CET
la stampante HPDeskJet9300 è in attesa. Abilitata da sab 21 nov 2009 18:15:58 CET
la stampante PDF è in attesa.  Abilitata da gio 19 nov 2009 17:29:14 CET</pre></div></div>

<p>Un diverso elenco, contenente i riferimenti delle stampanti (socket, path remoti, etc.) è ottenibile attraverso l&#8217;opzione &#8220;-v&#8221;:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;"># lpstat -v
dispositivo per Brother-HL-4040CN: socket://192.168.1.13
dispositivo per HPDeskJet9300: smb://RASCA/RASCABOX/HPDeskjet9300
dispositivo per PDF: cups-pdf:/</pre></div></div>

<p>E&#8217; possibile inoltre identificare la coda di default verso cui vengono diretti i lavori in stampa (opzione &#8220;-d&#8221;):</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;"># lpstat -d
destinazione predefinita di sistema: PDF</pre></div></div>

<p>Tutte le informazioni illustrate sono ottenibili in un unico contatto attraverso l&#8217;opzione &#8220;-t&#8221;, mentre, lanciato senza argomenti, il comando restituisce l&#8217;elenco dei lavori in coda, ottenibile anche con i comandi illustrati di seguito.</p>
<p><strong>Gestire la coda (utente root)</strong></p>
<p><strong><em>lpq</em></strong></p>
<p>E&#8217; possibile ottenere l&#8217;elenco dei lavori accodati nella stampante di default o di una specifica attraverso il comando <em>lpq</em>:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;"># lpq
PDF è pronta
Posiz.   Proprietario    Stampa   Doc.             Dim. totali
1st     rasca   298     Command-Line Printing and Optio 396288 byte</pre></div></div>

<p>Nel caso si volessero conoscere i dettagli della coda relativa ad una stampante specifica, questa va specificata con l&#8217;opzione &#8220;-P&#8221;:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;"># lpq -P HPDeskJet9300
HPDeskJet9300 è pronta
nessuna voce</pre></div></div>

<p><strong><em>lprm</em></strong></p>
<p>Per operare sulle code, rimuovendo lavori di cui si conosce l&#8217;identificativo (ottenuto attraverso <em>lpq</em>), è possibile utilizzare il comando <em>lprm</em>, indicando con l&#8217;opzione &#8220;-P&#8221; l&#8217;accoppiata coda/identificativo:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;"># lprm -P PDF/298</pre></div></div>

<p><strong>Inviare stampe (utente non privilegiato)</strong></p>
<p><strong><em>lpr</em></strong></p>
<p>Se un utente comune volesse lanciare delle stampe da linea di comando, cosa molto utile in caso di lavori di sistema notturni, notifiche di problemi (o qualsiasi altro motivo per cui <strong>sia sensato utilizzare della carta!</strong>), il comando da utilizzare è <em>lpr</em> che stampa il contenuto di un file di testo passato come parametro:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ lpr testfile</pre></div></div>

<p><strong><em>pr</em> e <em>fmt</em></strong></p>
<p><em>lpr</em> può essere utilizzato anche per dirigere l&#8217;output di un comando alla stampante. Ad esempio, utilizzando i comandi <em>pr</em> o <em>fmt</em> che formattano un file di testo per la stampa è possibile passare attraverso una <em>pipe</em> ad <em>lpr</em> la stampa da effettuare:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ pr -a testfile | lpr</pre></div></div>

<p>oppure</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ pr -a testfile | lpr</pre></div></div>

<p><strong><em>mpage</em></strong></p>
<p>Lo stesso discorso si applica al comando <em>mpage</em> che consente di operare con maggior dettaglio sul formato di stampa. Lanciato senza argomenti, <em>mpage</em> produrrà una pagina divisa in quattro contenente il testo all&#8217;interno del file passato come parametro. Attraverso l&#8217;opzione &#8220;-b&#8221;  è poi possibile specificare il formato della carta che verrà utilizzato dalla stampante (di default A4). Per conoscere i formati supportati è possibile utilizzare il parametro &#8220;-b&#8221; con l&#8217;aggiunta di un punto interrogativo:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ mpage -b?
Mpage knows about the following paper types:
Type           Points Wide Points High
-------------- ----------- -----------
Letter                 612         792
LetterSmall            612         792
Tabloid                792        1224
Ledger                1224         792
Legal                  612        1008
Statement              396         612
Executive              540         720
A0                    2384        3368
A1                    1684        2384
A2                    1192        1684
A3                     842        1192
A4                     596         842
A4Small                595         842
A5                     420         595
B4                     729        1032
B5                     516         729
Folio                  612         936
Quarto                 610         780
10x14                  720        1008</pre></div></div>

<p>Oltre all&#8217;utilizzo attraverso una <em>pipe</em>, mpage supporta anche la stampa diretta di file (anche in formato <em>postscript</em>), così come funziona <em>lpr</em>:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ mpage -PPDF testfile</pre></div></div>

<p>Numerose sono le opzioni disponibili per il comando <em>mpage</em> e sono tutte documentate nella <em>man page</em> del programma.</p>
<p><strong>Conclusioni</strong></p>
<p>Questa breve carrellata di comandi presenta alcune utili informazioni che potrebbero risultare vitali in situazioni (volute o meno) in cui non sia disponibile altro accesso al sistema che quello della linea di comando.<br />
Approfondendo presso i link presentati qui sotto sarà possibile acquisire la padronanza totale del sistema di stampa da linea di comando.</p>
<p><strong>Fonti di informazioni utili:</strong></p>
<p>Pagina ufficiale del progetto CUPS: <a href="http://www.cups.org/documentation.php/options.html">http://www.cups.org/documentation.php/options.html</a><br />
The Linux Printing Usage HOWTO: <a href="http://tldp.org/HOWTO/Printing-Usage-HOWTO.html">http://tldp.org/HOWTO/Printing-Usage-HOWTO.html</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.miamammausalinux.org/2009/12/linux-e-la-linea-di-comando-comandi-particolari-e-poco-conosciuti-gestione-delle-code-di-stampa/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Linux e la linea di comando, comandi particolari e poco conosciuti: manipolazione di stream e file di testo</title>
		<link>http://www.miamammausalinux.org/2009/10/linux-e-la-linea-di-comando-comandi-particolari-e-poco-conosciuti-manipolazione-di-stream-e-file-di-testo/</link>
		<comments>http://www.miamammausalinux.org/2009/10/linux-e-la-linea-di-comando-comandi-particolari-e-poco-conosciuti-manipolazione-di-stream-e-file-di-testo/#comments</comments>
		<pubDate>Thu, 01 Oct 2009 08:26:19 +0000</pubDate>
		<dc:creator>Raoul Scarazzini</dc:creator>
				<category><![CDATA[Bash]]></category>
		<category><![CDATA[Sistema]]></category>
		<category><![CDATA[Comandi poco conosciuti]]></category>
		<category><![CDATA[Linea di comando]]></category>
		<category><![CDATA[Manipolazione file di testo]]></category>
		<category><![CDATA[Programmazione]]></category>
		<category><![CDATA[Shell]]></category>

		<guid isPermaLink="false">http://www.miamammausalinux.org/?p=820</guid>
		<description><![CDATA[Nel primo articolo di questa serie sono stati affrontati i comandi interni alla shell Bash che permettono di agevolare il proprio lavoro ed ottimizzarne le tempistiche di realizzazione. In questa nuova puntata verranno trattati comandi di sistema, generalmente ignorati, richiamabili all&#8217;interno della shell Bash per la manipolazione degli stream di output e dei contenuti dei [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.miamammausalinux.org/wp-content/uploads/2009/01/linux.png" alt="linux" title="linux" width="85" height="100" class="alignnone size-full wp-image-292" /></p>
<p>Nel primo articolo di questa serie sono stati affrontati i comandi interni alla shell Bash che permettono di agevolare il proprio lavoro ed ottimizzarne le tempistiche di realizzazione.<br />
In questa nuova puntata verranno trattati comandi di sistema,  generalmente ignorati, richiamabili all&#8217;interno della shell Bash per la manipolazione degli stream di output e dei contenuti dei file.</p>
<p><strong>Comandi per l&#8217;elaborazione degli stream di testo</strong></p>
<p>Lo studio del contenuto dei file, dal filtro dei contenuti all&#8217;ordinamento di questi sono operazioni effettuate quotidianamente attraverso diffusissimi comandi come <em>cat</em>, <em>grep</em> e <em>sort</em>. Ma esiste un nutrito numero di comandi utilizzabili per l&#8217;elaborazione dei così detti &#8220;stream&#8221; di testo, eccone descritti alcuni.</p>
<p><em><strong>tac</strong></em></p>
<p>Il funzionamento di <em>tac</em> è quello dell&#8217;esatto opposto di <em>cat</em>. Esso infatti concatena e stampa il contenuto dei file in ordine inverso, partendo cioè dall&#8217;ultima riga. Supponendo di avere il seguente file di testo:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ cat elenco
1
2
3
4
5
6</pre></div></div>

<p>l&#8217;output generato da <em>tac</em> sarà il seguente:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ tac elenco
6
5
4
3
2
1</pre></div></div>

<p><em><strong>tr</strong></em></p>
<p>Il comando <em>tr</em> permette di modificare o cancellare caratteri da uno stream di input. Dato ad esempio il file contenente l&#8217;elenco precedente, sarà possibile ad esempio sostituire i caratteri <em>newline</em> (accapo) con il carattere &#8220;#&#8221;, utilizzando il comando in questa forma:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ cat elenco_num | tr &quot;\n&quot; &quot;#&quot;
1#2#3#4#5#6#</pre></div></div>

<p>L&#8217;opzione &#8220;<em>-d</em>&#8221; del comando consente di eliminare e non sostituire le occorrenze trovate, applicato al comando precedente, correggerebbe l&#8217;output come segue:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ cat elenco | tr &quot;\n&quot; &quot;#&quot; | tr -d &quot;#&quot;
12345678910</pre></div></div>

<p><em>tr</em> permette di utilizzare anche specifici set di caratteri, senza che ne venga indicato uno specifico. Ad esempio dato il seguente file di testo:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ cat elenco
A
B
C
D
E
F</pre></div></div>

<p>è possibile convertire tutte le lettere maiuscole in minuscole attraverso l&#8217;utilizzo dei seguenti set:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ cat elenco | tr &quot;[:upper:]&quot; &quot;[:lower:]&quot;
a
b
c
d
e
f</pre></div></div>

<p>L&#8217;elenco completo dei set di caratteri utilizzabili si trova nella <em>man page</em> del comando.</p>
<p><em><strong>nl</strong></em></p>
<p><em>nl</em> consente di numerare le righe proveniente da uno stream di input. La forma in cui la numerazione appare dipende dalle opzioni passate, senza alcuna opzione il comando numererà le righe con gli indici allineati a destra:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ cat elenco | nl
     1	A
     2	B
     3	C
     4	D
     5	E
     6	F</pre></div></div>

<p>è possibile specificare un formato diverso per l&#8217;indice di riga attraverso l&#8217;opzione &#8220;-n&#8221;, ad esempio per fare in modo che gli indici siano allineati a sinistra l&#8217;opzione da passare sarà &#8220;-n ln&#8221;, mentre per lasciare gli indici allineati a destra e fare in modo che gli spazi precedenti siano riempiti da zero l&#8217;opzione sarà &#8220;-n rz&#8221;.<br />
E&#8217; possibile specificare anche il carattere di separazione tra l&#8217;indice e la riga associata, che di default è tab, con un altro carattere attraverso l&#8217;opzione &#8220;-s&#8221;.<br />
Ecco un esempio:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ cat elenco | nl -n rz -s &quot;#&quot;
000001#A
000002#B
000003#C
000004#D
000005#E
000006#F</pre></div></div>

<p><em><strong>paste</strong></em></p>
<p>Il comando <em>paste</em> permette di unire due file riga per riga. Nell&#8217;esempio più banale paste è utilizzato come segue:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ paste elenco elenco_num 
A	1
B	2
C	3
D	4
E	5
F	6</pre></div></div>

<p>ed anche per questo comando è possibile sostituire con l&#8217;opzione &#8220;-d&#8221; il carattere che separa le righe, di default sempre tab, con un carattere a scelta:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ paste -d &quot;#&quot; elenco elenco_num
A#1
B#2
C#3
D#4
E#5
F#6</pre></div></div>

<p>paste può essere utilizzato per operare anche su stream di input in modo da unire le righe prodotte ad un&#8217;elaborazione a quelle di un file:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ tac elenco|paste - elenco
F	A
E	B
D	C
C	D
B	E
A	F</pre></div></div>

<p>lo stream generato dal comando <em>tac</em> viene utilizzato da <em>paste</em> attraverso l&#8217;introduzione del carattere &#8220;-&#8221; per ottenere l&#8217;unione di tutte le righe del file con quelle dello stesso, ma contrapposte.</p>
<p><em><strong>wc</strong></em></p>
<p><em>wc</em> effettua un conteggio e totalizza a seconda delle opzioni il numero di caratteri (&#8220;-m&#8221;), parole (&#8220;-w&#8221;), byte (&#8220;-c&#8221;) e linee (&#8220;-l&#8221;) di un file o di uno stream di input. Ad esempio per conoscere il numero di file nascosti presente in una directory, sarà sufficiente utilizzare il comando come segue:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ ls .* | wc -l
681</pre></div></div>

<p>Lanciato senza argomenti <em>wc</em> restituisce tre valori: il numero di linee, di parole e di byte. Ad esempio nel caso di un calcolo su due file il comportamento del comando sarà il seguente:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ wc elenco elenco_num 
 6  6 12 elenco
 6  6 12 elenco_num
12 12 24 totale</pre></div></div>

<p><em><strong>tee</strong></em></p>
<p>Il comando <em>tee</em> permette di redirigere l&#8217;output di un comando all&#8217;interno di un file e nel contempo stamparlo a video. Mentre la ridirezione classica effettuata attraverso il carattere &#8220;>&#8221; non permette di consultare istantaneamente l&#8217;output, attraverso <em>tee</em> è possibile osservare riproporre il flusso output del comando lanciato ed al contempo salvarlo in un file:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ tac elenco | tee elenco_inv | wc -l
6</pre></div></div>

<p>L&#8217;esempio dimostra la peculiarità del comando <em>tee</em>: lo stream di output viene registrato all&#8217;interno del file <em>elenco_inv</em> e passato al comando <em>wc</em> che ne calcola il numero di righe.</p>
<p><strong>Conclusioni</strong></p>
<p>Chiaramente ciascuno dei comandi illustrati possiede numerosi altri parametri che ne alterano il funzionamento, questi sono consultabili attraverso le <em>man page</em> sempre complete e prodighe di importanti informazioni. Scopo di questa serie di articoli rimane quello di fornire spunti dietro i quali approfondire.<br />
Nel prossimo articolo verranno affrontati i comandi utilizzabili per la gestione delle code di stampa da linea di comando.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.miamammausalinux.org/2009/10/linux-e-la-linea-di-comando-comandi-particolari-e-poco-conosciuti-manipolazione-di-stream-e-file-di-testo/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Linux e la linea di comando, comandi particolari e poco conosciuti: Bash, comandi interni alla shell</title>
		<link>http://www.miamammausalinux.org/2009/09/linux-e-la-linea-di-comando-comandi-particolari-e-poco-conosciuti-bash-comandi-interni-alla-shell/</link>
		<comments>http://www.miamammausalinux.org/2009/09/linux-e-la-linea-di-comando-comandi-particolari-e-poco-conosciuti-bash-comandi-interni-alla-shell/#comments</comments>
		<pubDate>Mon, 14 Sep 2009 16:40:20 +0000</pubDate>
		<dc:creator>Raoul Scarazzini</dc:creator>
				<category><![CDATA[Bash]]></category>
		<category><![CDATA[Programmazione]]></category>
		<category><![CDATA[Sistema]]></category>
		<category><![CDATA[Comandi poco conosciuti]]></category>
		<category><![CDATA[Linea di comando]]></category>
		<category><![CDATA[Shell]]></category>

		<guid isPermaLink="false">http://www.miamammausalinux.org/?p=781</guid>
		<description><![CDATA[La linea di comando e più propriamente la console bash rappresentano lo strumento di cui ogni sistemista Linux non può fare a meno. Modificare file, elaborare contenuti ed operare sui processi sono parte del lavoro quotidiano di chiunque gestisca sistemi informatici più o meno ampi. Interessante è capire come esistano moltissimi comandi a disposizione di [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.miamammausalinux.org/wp-content/uploads/2009/01/linux.png" alt="linux" title="linux" width="85" height="100" class="alignnone size-full wp-image-292" /></p>
<p>La linea di comando e più propriamente la console bash rappresentano lo strumento di cui ogni sistemista Linux non può fare a meno. Modificare file, elaborare contenuti ed operare sui processi sono parte del lavoro quotidiano di chiunque gestisca sistemi informatici più o meno ampi.<br />
Interessante è capire come esistano moltissimi comandi a disposizione di un sistemista oltre a quelli comunemente usati che, per quanto ignorati, possono facilitare il lavoro quotidiano.<br />
Questo primo articolo cerca di effettuare una panoramica ricca di esempi di come sia possibile utilizzare comandi incorporati della shell come <em>set</em>, <em>declare</em>, <em>type</em> e molti altri.</p>
<p><strong>Comandi interni alla shell</strong></p>
<p>La prima panoramica riguarda i comandi interni alla shell. Caratteristica di questi comandi è di non avere binari corrispondenti installati nel sistema (in directory come /bin, /sbin, /usr/bin e così via), infatti è l&#8217;ambiente erogato dall&#8217;eseguibile bash (a sua volta un binario installato nel sistema) a renderli disponibili.</p>
<p><em><strong>set</strong></em></p>
<p>Il comando <em>set</em> permette di modificare molti comportamenti e funzionalità della bash. Per abilitare una funzionalità si antepone all&#8217;opzione interessata un carattere &#8220;-&#8221;, viceversa per disabilitarla è sufficiente anteporre un carattere &#8220;+&#8221; all&#8217;opzione.<br />
Lanciato senza parametri il programma restituisce le impostazioni generali della shell, comprensive di variabili e funzioni che si riferiscono all&#8217;ambiente.<br />
Alcuni esempi di utilizzo di set:<br />
Per fare in modo che le variabili create vengano automaticamente esportate è possibile attivare l&#8217;opzione &#8220;a&#8221;:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ set -a
$ VARIABILE=&quot;VALORE&quot;
$ bash
$ echo $VARIABILE
VALORE</pre></div></div>

<p>Per fare in modo che i comandi lanciati all&#8217;interno del sistema siano stampati, sarà sufficiente attivare l&#8217;opzione &#8220;x&#8221;, prima dell&#8217;output di ogni comando successivo lanciato apparirà il comando effettivamente lanciato. Cosa questo significhi lo si capisce dal seguente listato:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">rasca@anomalia:~$ set -x
++ echo -ne '\033]0;rasca@anomalia: ~\007'
rasca@anomalia:~$ ls
+ ls --color=auto
...
...</pre></div></div>

<p>il comando lanciato è quindi in realtà un alias dello stesso con l&#8217;opzione &#8220;&#8211;color=auto&#8221;.</p>
<p>Le altre funzionalità relative al comando <em>set</em> si trovano nella voce omonima della <em>man page</em> del comando bash.</p>
<p><em><strong>declare</strong></em></p>
<p>Il comando <em>declare</em> è utilizzato per la dichiarazione delle variabili. Generalmente in bash una variabile viene dichiarata automaticamente con la sua definizione:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ FOO=bar</pre></div></div>

<p>dopodiché è utilizzabile con il nome $FOO. Il comando declare consente in fase di dichiarazione di specificare il tipo di variabile oltre che alcuni attributi inerenti al suo utilizzo.<br />
Ad esempio, per dichiarare un array utilizzando il comando declare si utilizzerà l&#8217;opzione &#8220;-a&#8221;:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ declare -a elementi=(&quot;primo&quot; &quot;secondo&quot; &quot;terzo&quot;)</pre></div></div>

<p>mentre l&#8217;opzione &#8220;-i&#8221; dichiarerà una variabile di tipo integer:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ declare -i numero=10</pre></div></div>

<p><em>declare</em> torna utile in fase di definizione anche per esportare automaticamente le variabili, attraverso l&#8217;opzione &#8220;-x&#8221;:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ declare -x -i numero=10</pre></div></div>

<p>questo comando ottiene lo stesso effetto di:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ export numero=10</pre></div></div>

<p>ma in più aggiunge anche la definizione del tipo. Infine, attraverso l&#8217;opzione &#8220;-r&#8221; è possibile rendere la variabile <em>readonly</em>, ossia non scrivibile all&#8217;interno della sessione.</p>
<p><em>NOTA: Le variabili di tipo array non sono esportabili a causa di un baco nella BASH (vedere la man page).</em></p>
<p><em><strong>type</strong></em></p>
<p>Il comando <em>type</em> può essere utilizzato per conoscere le caratteristiche relative agli argomenti passati. Attraverso l&#8217;opzione &#8220;-t&#8221; viene restituito il tipo di parametro passato:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ type -t ls
alias
$ type -t /bin/ls
file
$ type -t echo
builtin
$ type -t set_prefix
function
$ type -t while  
keyword</pre></div></div>

<p>E&#8217; da notare la differenza tra &#8220;ls&#8221; e &#8220;/bin/ls&#8221;, rispettivamente un <em>alias</em> (relativo ad un file eseguibile) ed un <em>file</em> eseguibile. Ad un comando di tipo <em>builtin</em> non corrisponde necessariamente un file eseguibile, mentre le ultime due righe rappresentano rispettivamente una funzione disponibile nell&#8217;ambiente ed una parola chiave relativa al linguaggio bash.<br />
Un&#8217;altra opzione supportata dal comando <em>type</em> è &#8220;-a&#8221; che indica tutte le corrispondenze al parametro passato. Ad esempio, relativamente ai comandi precedentemente esposti i risultati saranno i seguenti:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ type -a echo
echo is a shell builtin
echo is /bin/echo
$ type -a ls  
ls is aliased to `ls --color=auto'
ls is /bin/ls
$ type -a set_prefix
set_prefix is a function
set_prefix () 
{ 
    [ -z ${prefix:-} ] || prefix=${cur%/*}/;
    [ -r ${prefix:-}CVS/Entries ] || prefix=&quot;&quot;
}
$ type -a while     
while is a shell keyword</pre></div></div>

<p>il comando <em>echo</em> viene indicato come interno e disponibile inoltre con l&#8217;eseguibile <em>/bin/echo</em>, lo stesso avviene per il comando <em>ls</em> per il quale viene indicata la definizione dell&#8217;alias oltre che il path del file effettivo. Infine la funzione <em>set_prefix</em> viene stampata nella sua interezza, mentre per <em>while</em> rimane l&#8217;indicazione di <em>keyword</em>.</p>
<p><em><strong>exec</strong></em></p>
<p>Il comando <em>exec</em> permette di lanciare un comando utilizzando il <em>process ID</em> (PID) della shell corrente. Questo significa che la shell verrà rimpiazzata dal comando, non generando un nuovo <em>PID</em> e comporta inoltre che il termine del comando corrisponderà con il termine della shell.<br />
Ad esempio, se nell&#8217;ambiente grafico da una console viene lanciato il comando</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ exec xterm</pre></div></div>

<p>alla chiusura della shell del programma <em>xterm</em>, anche la console verrà automaticamente chiusa.</p>
<p><em><strong>jobs</strong></em></p>
<p>Se il comando interno <em>bg</em> viene utilizzato per mandare un processo in background (cioè sullo sfondo del sistema e non in primo piano, mantenendone l&#8217;esecuzione) ed il comando interno <em>fg</em> viene utilizzato invece per mandare in foreground (quindi, in primo piano) un processo, il comando <em>jobs</em> permette di effettuare il listato dei processi e di conoscere informazioni relative a questi.<br />
Supponendo di avere due script denominati <em>script</em> e <em>script1</em> lanciati entrambi automaticamente in background attraverso il carattere speciale <em>&#038;</em> alla fine dell&#8217;invocazione:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ ./script &amp;
[1] 28548
$ ./script1 &amp;
[2] 29261</pre></div></div>

<p>Sarà possibile conoscere lo stato dei processi in sospeso attraverso <em>jobs</em>:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ jobs
[1]-  Running                 ./script &amp;
[2]+  Running                 ./script1 &amp;</pre></div></div>

<p>Di questi attraverso l&#8217;opzione &#8220;-l&#8221; si potrà conoscere identificativo e <em>PID</em>:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ jobs -l
[1]- 28548 Running                 ./script &amp;
[2]+ 29261 Running                 ./script1 &amp;</pre></div></div>

<p>O solamente il <em>PID</em>:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ jobs -p
28548
29261</pre></div></div>

<p>Su tali processi sarà possibile effettuare operazioni di <em>kill</em> (considerando il <em>PID</em>):</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ kill 28548
$ 
[1]-  Terminated              ./script</pre></div></div>

<p>Oppure operazioni di foregrounding/backgrounding, attraverso i già citati comandi interni <em>fg</em> e <em>bg</em>, considerando invece l&#8217;identificativo:</p>

<div class="wp_syntax"><div class="code"><pre class="console" style="font-family:monospace;">$ fg 2
./script1</pre></div></div>

<p>Il tutto grazie ai dati resi disponibili dal comando interno <em>jobs</em>.</p>
<p><strong>Conclusioni</strong></p>
<p>I comandi interni alla bash illustrati e molti altri sono tutti ottimamente documentati all&#8217;interno della già citata man page della Bash (<em>$ man bash</em>), più propriamente nel capitolo &#8220;<em>COMANDI INCORPORATI DELLA SHELL</em>&#8220;.<br />
Nella seconda parte di questo articolo verranno trattate utility di sistema come <em>paste</em>, <em>tee</em>, <em>apropos</em> e molte altre, generalmente poco utilizzate, ma di indubbio interesse.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.miamammausalinux.org/2009/09/linux-e-la-linea-di-comando-comandi-particolari-e-poco-conosciuti-bash-comandi-interni-alla-shell/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

