<?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; Bash</title>
	<atom:link href="http://www.miamammausalinux.org/tag/bash/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>Tue, 27 Jul 2010 12:03:21 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<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>
