<?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>SIMOTRONE WEB PAGE &#187; bash</title>
	<atom:link href="http://www.simotrone.it/tag/bash/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.simotrone.it</link>
	<description>Simotrone is always here!</description>
	<lastBuildDate>Sat, 04 Feb 2012 18:30:44 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1</generator>
		<item>
		<title>Globbing</title>
		<link>http://www.simotrone.it/2011/04/16/globbing/</link>
		<comments>http://www.simotrone.it/2011/04/16/globbing/#comments</comments>
		<pubDate>Sat, 16 Apr 2011 15:12:48 +0000</pubDate>
		<dc:creator>Simotrone</dc:creator>
				<category><![CDATA[Binary People]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[globbing]]></category>
		<category><![CDATA[Perl]]></category>

		<guid isPermaLink="false">http://www.simotrone.it/?p=3322</guid>
		<description><![CDATA[Quando si scrive qualcosa sulla linea di comando, si può scoprire che la shell fa qualcosa, come ad esempio espandere caratteri speciali. Questa espansione di pattern alla ricerca di nomi corrispondenti, si chiama globbing. Situazione: sim@idrogeno:~/dev/perl/markdown$ ls -1 index.html index.html.tidy index.text Markdown_1.0.1 mathjax-MathJax-5a7e4d7 remarkable test_multi.html test_multi.pl test_multi.txt sim@idrogeno:~/dev/perl/markdown$ ls *html index.html test_multi.html sim@idrogeno:~/dev/perl/markdown$ echo *html [...]]]></description>
			<content:encoded><![CDATA[<p>Quando si scrive qualcosa sulla linea di comando, si può scoprire che la shell fa qualcosa, come ad esempio espandere caratteri speciali.<br />
Questa espansione di <em>pattern</em> alla ricerca di nomi corrispondenti, si chiama <strong>globbing</strong>.</p>
<p>Situazione:</p>
<pre>sim@idrogeno:~/dev/perl/markdown$ ls -1
index.html
index.html.tidy
index.text
Markdown_1.0.1
mathjax-MathJax-5a7e4d7
remarkable
test_multi.html
test_multi.pl
test_multi.txt

sim@idrogeno:~/dev/perl/markdown$ ls *html
index.html  test_multi.html

sim@idrogeno:~/dev/perl/markdown$ echo *html
index.html test_multi.html</pre>
<p>La shell espande la stringa *html nelle eventuali corrispondenze trovate nei nomi dei file nella directory.</p>
<p>Nel caso la shell non trovi corrispondenze, tratta il pattern come una stringa qualsiasi.</p>
<pre>sim@idrogeno:~/dev/perl/markdown$ echo *xyz
*xyz</pre>
<p><strong>man bash</strong>, paragrafo <strong>Pathname Expansion</strong>.<br />
Dopo aver diviso le parole (<em>word splitting</em>), bash cerca ogni parola coi caratteri <strong>*</strong>, <strong>?</strong> e <strong>[</strong>; se uno di questi compare la parola viene trattata come un <strong>pattern</strong> e rimpiazzata con una lista di nomi di file corrispondenti il pattern in ordine alfabetico.<br />
Se non vi è alcuna corrispondenza, e l'opzione <strong>nullglob</strong> non è abilitata, la parola viene lasciata immutata - se <strong>nullglob</strong> è impostata, la parola viene rimossa dall'elenco.</p>
<p>Riguardo il <strong>Pattern Matching</strong>: ogni singolo carattere (esclusi quelli indicati sopra, nel caso non vengano "escapati" col <em>backslash</em>) che appare nel pattern corrisponde a se stesso.</p>
<ul>
<li>* corrisponde a qualunque stringa</li>
<li>? corrisponde a un qualunque singolo carattere</li>
<li>[...] (<em>range expression</em>) corrisponde a un qualunque carattere di quelli contenuti. [!...] o [^...] per negare la corrispondenza col carattere.</li>
</ul>
<pre>sim@idrogeno:~/dev/perl/markdown$ echo test_multi.[hp]*
test_multi.html test_multi.pl
sim@idrogeno:~/dev/perl/markdown$ echo test_multi.[!hp]*
test_multi.txt
sim@idrogeno:~/dev/perl/markdown$ echo test_multi.[^hp]*
test_multi.txt</pre>
<p>In Perl il globbing funziona alla stessa maniera utilizzando l&#8217;operatore <em>glob</em> oppure il &#8220;<em>diamond</em>&#8220;:</p>
<div class="codesnip-container" >
<div class="codesnip" style="font-family: monospace;"><span class="kw1">my</span> <span class="re0">@images</span> = <a href="http://perldoc.perl.org/functions/glob.html"><span class="kw3">glob</span></a> <span class="st0">&quot;*.jpg&quot;</span><br />
<span class="kw1">my</span> <span class="re0">@all_files</span> = <a href="http://perldoc.perl.org/functions/glob.html"><span class="kw3">glob</span></a> <span class="st0">&quot;* .*&quot;</span><br />
<span class="co1"># oppure</span><br />
<span class="kw1">my</span> <span class="re0">@all_files</span> = &lt;* .*&gt;</div>
</div>
<p>Ovviamente se si vogliono fare le cose per bene, si va con i directory handles (opendir, readdir, closedir).</p>
]]></content:encoded>
			<wfw:commentRss>http://www.simotrone.it/2011/04/16/globbing/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>find</title>
		<link>http://www.simotrone.it/2010/09/02/find/</link>
		<comments>http://www.simotrone.it/2010/09/02/find/#comments</comments>
		<pubDate>Thu, 02 Sep 2010 05:13:24 +0000</pubDate>
		<dc:creator>Simotrone</dc:creator>
				<category><![CDATA[Binary People]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[bash -c]]></category>
		<category><![CDATA[find]]></category>

		<guid isPermaLink="false">http://www.simotrone.it/?p=3033</guid>
		<description><![CDATA[La shell bash e find continuano ad emanare il loro esagerato fascino su di me, nonostante le insidie che presentano. Su irc.freenode, c&#8217;è un canale #bash che trovo interessante solo da seguire come osservatore esterno. Da man: SYNOPSIS find [-H] [-L] [-P] [path...] [expression] Lasciamo perdere le opzioni, e path è il path da cui [...]]]></description>
			<content:encoded><![CDATA[<p>La shell bash e find continuano ad emanare il loro esagerato fascino su di me, nonostante le insidie che presentano.</p>
<p>Su irc.freenode, c&#8217;è un canale #bash che trovo interessante solo da seguire come osservatore esterno.</p>
<p>Da man:</p>
<pre>SYNOPSIS
       find [-H] [-L] [-P] [path...] [expression]</pre>
<p>Lasciamo perdere le opzioni, e path è il path da cui cominciare la ricerca.<br />
Le espressioni si suddividono in 3 categorie: <strong>options</strong>, <strong>tests</strong>, <strong>actions</strong>; il tutto è separato da <strong>operators</strong> &#8211; ed in mancanza di essi si suppone siano degli <em>-and</em>.</p>
<h2>Test</h2>
<p>Una delle cose più ganze sono i test; descrivo quelli che mi sono utili in condizioni comuni.</p>
<ul>
<li><strong>-empty</strong> : ritorna i file vuoti.</li>
<li><strong>-name pattern</strong> : dove pattern e&#8217; il nome del file da cercare, ed è meglio quotare il pattern per evitare che la shell espanda i caratteri speciali (ie: insomma, usare &#8216;*jpg&#8217; invece del semplice *jpg). -iname è la versione case insensitive.</li>
<li><strong>-type c</strong> : ritorna vero dove c è il tipo di file indicato (d per le directory, f per i file, l per i link simbolici, p per le pipe, s per i socket&#8230;).</li>
<li><strong>-size nn</strong> : fa un test legato alla grandezza del file. Può gestire un prefisso +/- per indicare se il test deve essere su numeri maggiori o minori di quello indicato, e un suffisso c,k,M,G che indica rispettivamente byte, kilobyte, megabyte e gigabyte.</li>
<li><strong>-perm mode </strong>: cerca i file con i permessi esatti indicati (ie: -perm 0644 cerca tutti i file con esattamente i permessi di <strong>-rw-r&#8211;r&#8211;</strong> )</li>
<li><strong>-path pattern</strong> : fa un matching come -name, ma si basa sull&#8217;intera directory invece che solo sul (base)name del file e non tratta in maniera speciale i metacaratteri <strong>.</strong> e <strong>/</strong>.</li>
<li><strong>-amin/-atime n</strong> : Ritorna vero se l&#8217;ultimo accesso (file utilizzato) è stato effettuato n minuti o giorni fa.</li>
<li><strong>-mmin/-mtime n</strong> : Ritorna vero se l&#8217;ultima modifica al file è stata effettuata n minuti o giorni fa.</li>
</ul>
<p>I valori numerici possono avere come prefisso nulla, un + (più) per indicare una cifra maggiore di quella indicata, e un &#8211; (meno) per indicare una cifra minore di quella indicata.</p>
<div class="codesnip-container" >
<div class="codesnip" style="font-family: monospace;">sim@idrogeno:~$ <span class="kw2">find</span> . -maxdepth <span class="nu0">1</span> -<span class="kw3">type</span> f -<span class="kw2">size</span> +1M</div>
</div>
<p>Trova tutti i file (-type f) al primo livello (-maxdepth 1, quindi non va nelle subdir) dato il path di partenza (.), con size maggiore di 1 Mega. </p>
<h2>Opzioni</h2>
<p>Le opzioni non mi sembrano particolarmente interessanti, quindi andate di man. <img src='http://www.simotrone.it/wp-includes/images/smilies/icon_razz.gif' alt=':-P' class='wp-smiley' /> </p>
<ul>
<li><strong>-maxdepth nn</strong> : indica per quanti livelli discendere nella ricerca. 0 è la linea di comando, 1 è la dir attuali, 2 indica le subdir subito seguenti, ecc&#8230;</li>
<li><strong>-mindepth nn</strong> : come sopra, ma non applica i test nelle dir indicate&#8230;</li>
<li><strong>-mount/-xdev</strong> : non discende in directory che sono in altri filesystem &#8211; molto utile per evitare di girovagare fra mount di samba o altro&#8230;</li>
</ul>
<h2>Actions</h2>
<p>Qui si comincia a ridere&#8230;<br />
Le azioni fanno. Per l&#8217;esattezza di solito fanno qualcosa coi file che hanno passati i test. Alcune possono in definitiva essere pericolose &#8211; in quanto ottengono risultati.</p>
<ul>
<li><strong>-print</strong> : la più banale, innocua e semplice (e di default): stampa il risultato dei test. <strong>-print0</strong> stampa con un \0 finale (no newline).</li>
<li><strong>-ls</strong> : stampa info sui file che hanno superato i test come se si fosse digitato ls -dils per ognuno di essi. (d: visualizza il nome delle dir ma non il loro contenuto, i: visualizza l&#8217;inode del file, l: formato esteso, s: stampa la size in blocchi).</li>
<li><strong>-exec comando \;</strong> : esegue l&#8217;argomento di -exec fino al <strong>;</strong> (che ha un escape davanti per evitare di essere &#8220;mangiato&#8221; dalla shell). La stringa <strong>{}</strong> è rimpiazzata dal filename attuale &#8211; e deve essere <em>escape&#8217;ata</em> anch&#8217;essa. Il comando viene eseguito una volta per file <em>match&#8217;ante</em>.</li>
<li><strong>-ok comando \;</strong> : funziona come -exec, ma chiede conferma.</li>
<li><strong>-printf formato</strong> : visualizza seguendo il foramto tipico della printf del C.</li>
<li><strong>-prune</strong> : se il file è una dir, non discende attraverso di essa.</li>
</ul>
<h2>Operatori</h2>
<p>Gli operatori spesso non vengono capiti nelle espressioni di find, ma sono pochi e semplici da capire. Ricordo che se fra due espressioni non c&#8217;è alcun operatore, si assume ci sia <strong>-and</strong>.<br />
Le parentesi <strong>( )</strong>forniscono la precedenza da seguire, in casi ambigui.</p>
<ul>
<li><strong>! / -not</strong> : negazione</li>
<li><strong>-a / -and</strong> : and</li>
<li><strong>-o / -or</strong> : or</li>
</ul>
<p>Esempi:<br />
* Ricerchiamo file vuoti nella nostra home:</p>
<div class="codesnip-container" >
<div class="codesnip" style="font-family: monospace;">sim@idrogeno:~$ <span class="kw2">find</span> . -empty -and -print</div>
</div>
<p>Spiegazione: trova nel path . i file che passano il test -empty e stampa. notare che -print è assunto di default e gli -and sono messi in automatico fra le condizioni quando mancano; in pratica <strong>find -empty</strong> dice già a find di cercare tutti i file nella directory locale che superano il test di size zero, e li stampa a terminale.</p>
<p>* Ricerchiamo file dove l&#8217;utente non siamo noi nella nostra home.</p>
<div class="codesnip-container" >
<div class="codesnip" style="font-family: monospace;">sim@idrogeno:~$ <span class="kw2">find</span> . -not -user sim -print</div>
</div>
<p>* Ricerchiamo file esagerati&#8230; (e le risposte non vi piaceranno)</p>
<div class="codesnip-container" >
<div class="codesnip" style="font-family: monospace;">sim@idrogeno:~$ <span class="kw2">find</span> . -<span class="kw2">size</span> +1G -<span class="kw2">ls</span></div>
</div>
<p>(Brutta cosa, mi ha fatto vedere questo:</p>
<pre>7373607 1998756 -rw-------   1 sim      sim      2044723200 Aug 18 07:14
  ./.kde/share/apps/nepomuk/repository/main/data/virtuosobackend/soprano-virtuoso.db
</pre>
<p>e io non ho kde come DE&#8230; F@nku)</p>
<p>Manipolazioni interessanti di nomi di file:</p>
<div class="codesnip-container" >
<div class="codesnip" style="font-family: monospace;">sim@idrogeno:~$ <span class="kw2">find</span> . -path <span class="st0">&#8216;./.spamassassin&#8217;</span> -<span class="kw2">prune</span> -or -name <span class="st0">&#8216;*xml&#8217;</span> -<span class="kw2">size</span> +1M -print -<span class="kw3">exec</span> bash -c <span class="st0">&#8216;echo ${0%.xml}-obeso.xml&#8217;</span> \<span class="br0">&#123;</span><span class="br0">&#125;</span> \;</div>
</div>
<p>Dunque, questa è uno scherzo con echo, ma si possono fare cose ganze ovviamente con gli accorgimenti di questa riga.<br />
In pratica find cerca in locale, se trova un <strong>path</strong> che si chiama &#8216;./.spamassassin&#8217; lo evita (<strong>-prune</strong>), poi cerca i file con il nome che si conclude con xml, di grandezza superiore ad 1MB e li stampa con l&#8217;azione print, inoltre per ogni file esegue anche una shell bash che prende il comando da stringa (con <strong>-c</strong>); <strong>echo ${0%.xml}-obeso.xml</strong> semplicemente prende il nome del file sotto analisi con <strong>{}</strong>, lo passa a <strong>$0</strong> (in quanto primo argomento dopo la stringa), ne fa un espansione tagliata con <strong>%.xml</strong> e ci aggiunge il resto.</p>
<p>Grazie a stringhe come l&#8217;ultima, si possono eseguire compiti anche molto complessi con find, -exec e bash insieme. <img src='http://www.simotrone.it/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.simotrone.it/2010/09/02/find/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Parametri bash</title>
		<link>http://www.simotrone.it/2010/08/25/parametri-bash/</link>
		<comments>http://www.simotrone.it/2010/08/25/parametri-bash/#comments</comments>
		<pubDate>Wed, 25 Aug 2010 05:31:46 +0000</pubDate>
		<dc:creator>Simotrone</dc:creator>
				<category><![CDATA[Binary People]]></category>
		<category><![CDATA[bash]]></category>

		<guid isPermaLink="false">http://www.simotrone.it/?p=3015</guid>
		<description><![CDATA[Orco boia, bisognerebbe conoscerlo bene sto benedetto bash&#8230; Il carattere $ introduce l&#8217;espansione di un parametro: sim@idrogeno:~$ saluti=&#8216;Saluti da H&#8217; sim@idrogeno:~$ echo $saluti Saluti da H Fin qua easy. Il parametro da espandere può essere racchiuso fra parentesi graffe { } per evitare ambiguità: $saluti è identico a ${saluti}. E anche qua, easy. Cose più [...]]]></description>
			<content:encoded><![CDATA[<p>Orco boia, bisognerebbe conoscerlo <u>bene</u> sto benedetto bash&#8230; <img src='http://www.simotrone.it/wp-includes/images/smilies/icon_sad.gif' alt=':-(' class='wp-smiley' /> </p>
<p>Il carattere <strong>$</strong> introduce l&#8217;espansione di un parametro:</p>
<div class="codesnip-container" >
<div class="codesnip" style="font-family: monospace;">sim@idrogeno:~$ <span class="re2">saluti=</span><span class="st0">&#8216;Saluti da H&#8217;</span><br />
sim@idrogeno:~$ <span class="kw3">echo</span> <span class="re1">$saluti</span><br />
Saluti da H</div>
</div>
<p>Fin qua <em>easy</em>.</p>
<p>Il parametro da espandere può essere racchiuso fra parentesi graffe <strong>{ }</strong> per evitare ambiguità: <strong>$saluti</strong> è identico a <strong>${saluti}</strong>. E anche qua, <em>easy</em>.</p>
<p>Cose più ficche sono queste:</p>
<pre>Default values: ${parameter:-word}
Assign: ${parameter:=word}
${parameter:?word}
${parameter:+word}
${parameter:offset}
Substring: ${parameter:offset:length}
...</pre>
<p>Il primo costrutto funziona come un operatore ternario: <strong>parameter ? parameter : word</strong>.<br />
Il secondo fa anche l&#8217;assegnamento.<br />
Ecc&#8230;</p>
<div class="codesnip-container" >
<div class="codesnip" style="font-family: monospace;">sim@idrogeno:~$ <span class="kw3">echo</span> $<span class="br0">&#123;</span>saluti:-<span class="st0">&#8216;Saluti da Mario&#8217;</span><span class="br0">&#125;</span><br />
Saluti da H<br />
sim@idrogeno:~$ <span class="kw3">echo</span> $<span class="br0">&#123;</span>greetings:-<span class="st0">&#8216;Saluti da Mario&#8217;</span><span class="br0">&#125;</span><br />
Saluti da Mario</div>
</div>
<p><strong>$saluti</strong> era già assegnato, quindi non è stato cambiato il suo contenuto. $greetings invece era vuoto, quindi è stato stampata a schermo l&#8217;alternativa (&#8220;Saluti da Mario&#8221;).<br />
Comunque, se stampiamo <strong>$greetings</strong> &#8230;</p>
<div class="codesnip-container" >
<div class="codesnip" style="font-family: monospace;">sim@idrogeno:~$ <span class="kw3">echo</span> <span class="re1">$greetings</span></p>
<p>sim@idrogeno:~$ <span class="kw3">echo</span> $<span class="br0">&#123;</span>saluti:=<span class="st0">&#8216;Saluti da Mario&#8217;</span><span class="br0">&#125;</span> $<span class="br0">&#123;</span>greetings:=<span class="st0">&#8216;Saluti da Pippo&#8217;</span><span class="br0">&#125;</span><br />
Saluti da H Saluti da Pippo<br />
sim@idrogeno:~$ <span class="kw3">echo</span> <span class="re1">$greetings</span><br />
Saluti da Pippo</div>
</div>
<p><strong>$greetings</strong> era vuoto, perchè <strong>:-</strong> non assegna. Con <strong>:=</strong> abbiamo l&#8217;assegnamento se la variabile non è <strong>null</strong> o <strong>undef</strong>.<br />
<strong>:+</strong> funziona alla rovescia: <u>non</u> rimpiazza se la variabile (<strong>$caio</strong>) è vuota, ma se ne prendiamo una con già un contenuto (<strong>$greetings</strong>) ritorna il valore alternativo.</p>
<div class="codesnip-container" >
<div class="codesnip" style="font-family: monospace;">sim@idrogeno:~$ <span class="kw3">echo</span> $<span class="br0">&#123;</span>caio:+pippo<span class="br0">&#125;</span></p>
<p>sim@idrogeno:~$ <span class="kw3">echo</span> $<span class="br0">&#123;</span>greetings:+pippo<span class="br0">&#125;</span><br />
pippo<br />
sim@idrogeno:~$ <span class="kw3">echo</span> <span class="re1">$greetings</span><br />
Saluti da Pippo</div>
</div>
<p>Come si nota dall&#8217;ultima riga, <strong>:+</strong> non assegna il nuovo valore (che quindi rimane quello precedente), ma ritorna solo un&#8217;alternativa al check se il parametro è vuoto.</p>
<p>L&#8217;espansione con <strong> <img src='http://www.simotrone.it/wp-includes/images/smilies/icon_confused.gif' alt=':?' class='wp-smiley' /> </strong> serve a produrre messaggi di errore con il testo di word nel caso il parametro sia null/undef.</p>
<div class="codesnip-container" >
<div class="codesnip" style="font-family: monospace;">sim@idrogeno:~$ <span class="kw3">echo</span> -e $<span class="br0">&#123;</span>caio:?Questo \<span class="re1">$caio</span> è proprio vuoto<span class="br0">&#125;</span><br />
bash: caio: Questo <span class="re1">$caio</span> è proprio vuoto</div>
</div>
<p>Riferimenti: <a href="http://www.gnu.org/software/bash/manual/bashref.html#Shell-Parameter-Expansion">Bash Reference Manual</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.simotrone.it/2010/08/25/parametri-bash/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Bash brace expansion</title>
		<link>http://www.simotrone.it/2009/11/24/bash-brace-expansion/</link>
		<comments>http://www.simotrone.it/2009/11/24/bash-brace-expansion/#comments</comments>
		<pubDate>Tue, 24 Nov 2009 06:50:30 +0000</pubDate>
		<dc:creator>Simotrone</dc:creator>
				<category><![CDATA[Binary People]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[brace expansion]]></category>
		<category><![CDATA[seq]]></category>
		<category><![CDATA[sort]]></category>
		<category><![CDATA[trucchi]]></category>

		<guid isPermaLink="false">http://www.simotrone.it/?p=2433</guid>
		<description><![CDATA[Di recente mi sono imbattuto in un problemino minchione: avere una sequenza di numeri in ordine inverso (cioè non da 1 a 20 ma da 20 a 1). Fin qui tutto easy. Di solito se devo avere una sequenza uso appunto seq: $ seq 1 10 Che stampa appunto i numeri da 1 a 10. [...]]]></description>
			<content:encoded><![CDATA[<p>Di recente mi sono imbattuto in un problemino minchione: avere una sequenza di numeri in ordine inverso (cioè non da 1 a 20 ma da 20 a 1). Fin qui tutto easy.</p>
<p>Di solito se devo avere una sequenza uso appunto <a href="http://linux.die.net/man/1/seq">seq</a>:</p>
<div class="codesnip-container" >
<div class="codesnip" style="font-family: monospace;">$ <span class="kw2">seq</span> <span class="nu0">1</span> <span class="nu0">10</span></div>
</div>
<p>Che stampa appunto i numeri da 1 a 10.<br />
Il problema è che il contrario non mi funzionava.</p>
<div class="codesnip-container" >
<div class="codesnip" style="font-family: monospace;">$ <span class="kw2">seq</span> <span class="nu0">10</span> <span class="nu0">1</span></div>
</div>
<p>Nada.</p>
<p>Comunque, mentre cogitavo su questo e quello, e mentre mischiavo seq con sort mi sono imbattuto in una finezza bash che non conoscevo: la <a href="http://snap.nlc.dcccd.edu/reference/bash1/features_11.html">brace expansion</a>.</p>
<p>Le brace expansion permettono di creare un output multiplo:</p>
<div class="codesnip-container" >
<div class="codesnip" style="font-family: monospace;">sim@idrogeno:~$ <span class="kw3">echo</span> <span class="br0">&#123;</span>Zio,Gastone<span class="br0">&#125;</span>Paperone<br />
ZioPaperone GastonePaperone</div>
</div>
<p>In effetti anche:</p>
<div class="codesnip-container" >
<div class="codesnip" style="font-family: monospace;">sim@idrogeno:~$ <span class="kw3">echo</span> <span class="br0">&#123;</span><span class="nu0">20</span>..<span class="nu0">1</span><span class="br0">&#125;</span><br />
<span class="nu0">20</span> <span class="nu0">19</span> <span class="nu0">18</span> <span class="nu0">17</span> <span class="nu0">16</span> <span class="nu0">15</span> <span class="nu0">14</span> <span class="nu0">13</span> <span class="nu0">12</span> <span class="nu0">11</span> <span class="nu0">10</span> <span class="nu0">9</span> <span class="nu0">8</span> <span class="nu0">7</span> <span class="nu0">6</span> <span class="nu0">5</span> <span class="nu0">4</span> <span class="nu0">3</span> <span class="nu0">2</span> <span class="nu0">1</span></div>
</div>
<p>e</p>
<div class="codesnip-container" >
<div class="codesnip" style="font-family: monospace;">sim@idrogeno:~$ <span class="kw3">echo</span> <span class="nu0">0</span><span class="br0">&#123;</span><span class="nu0">1</span>..<span class="nu0">20</span><span class="br0">&#125;</span><br />
<span class="nu0">01</span> <span class="nu0">02</span> <span class="nu0">03</span> <span class="nu0">04</span> <span class="nu0">05</span> <span class="nu0">06</span> <span class="nu0">07</span> <span class="nu0">08</span> <span class="nu0">09</span> <span class="nu0">010</span> <span class="nu0">011</span> <span class="nu0">012</span> <span class="nu0">013</span> <span class="nu0">014</span> <span class="nu0">015</span> <span class="nu0">016</span> <span class="nu0">017</span> <span class="nu0">018</span> <span class="nu0">019</span> <span class="nu0">020</span></div>
</div>
<p>Inoltre si possono creare più concatenazioni:</p>
<div class="codesnip-container" >
<div class="codesnip" style="font-family: monospace;">sim@idrogeno:~$ <span class="kw1">for</span> stringa <span class="kw1">in</span> <span class="br0">&#123;</span>A..C<span class="br0">&#125;</span><span class="br0">&#123;</span><span class="nu0">1</span>..<span class="nu0">3</span><span class="br0">&#125;</span><span class="br0">&#123;</span>x..z<span class="br0">&#125;</span>; <span class="kw1">do</span> <span class="kw3">echo</span> -n <span class="st0">&quot;$stringa &quot;</span>; <span class="kw1">done</span><br />
A1x A1y A1z A2x A2y A2z A3x A3y A3z B1x B1y B1z B2x B2y B2z B3x B3y B3z C1x C1y C1z C2x C2y C2z C3x C3y C3z</div>
</div>
<p>Perchè possono risultare comode?<br />
Beh, ad esempio, come spiegato nella pagina linkata, per questo:</p>
<div class="codesnip-container" >
<div class="codesnip" style="font-family: monospace;">sim@idrogeno:~$ <span class="kw2">ls</span> /usr/lib/<span class="kw2">perl</span><span class="br0">&#123;</span><span class="nu0">5</span>,/<span class="nu0">5.10</span><span class="br0">&#125;</span>/Data/<br />
/usr/lib/<span class="kw2">perl</span>/<span class="nu0">5.10</span>/Data/:<br />
Dumper.pm</p>
<p>/usr/lib/perl5/Data/:<br />
Alias.pm</div>
</div>
<p>o questo</p>
<div class="codesnip-container" >
<div class="codesnip" style="font-family: monospace;">sim@idrogeno:~$ <span class="kw2">mkdir</span> -v tmp/<span class="br0">&#123;</span><span class="kw3">test</span>,a,z<span class="br0">&#125;</span><br />
<span class="kw2">mkdir</span>: created directory <span class="st0">&#8216;tmp/test&#8217;</span><br />
<span class="kw2">mkdir</span>: created directory <span class="st0">&#8216;tmp/a&#8217;</span><br />
<span class="kw2">mkdir</span>: created directory <span class="st0">&#8216;tmp/z&#8217;</span></p>
<p>sim@idrogeno:~$ <span class="kw2">rmdir</span> -v tmp/<span class="br0">&#123;</span><span class="kw3">test</span>,a,z<span class="br0">&#125;</span><br />
<span class="kw2">rmdir</span>: removing directory, <span class="st0">&#8216;tmp/test&#8217;</span><br />
<span class="kw2">rmdir</span>: removing directory, <span class="st0">&#8216;tmp/a&#8217;</span><br />
<span class="kw2">rmdir</span>: removing directory, <span class="st0">&#8216;tmp/z&#8217;</span></div>
</div>
<p> <img src='http://www.simotrone.it/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<p><span id="more-2433"></span><br />
Per la cronaca, seq &#8220;alla rovescia&#8221; non mi funzionava perchè non avevo letto bene il manuale.<br />
La sintassi di seq è semplice: </p>
<pre>$ seq [OPTION] LAST
$ seq [OPTION] FIRST LAST
$ seq [OPTION] FIRST INCREMENT LAST</pre>
<p>Se FIRST o INCREMENT sono omessi, di default prendono il valore 1. Come si può capire facilmente, quindi seq 10 1 non ha senso. (Ah, fra le opzioni c&#8217;e&#8217; &#8211;format che permette di stampare con dei placeholder stile printf.)</p>
<p>Quindi per avere quello che voglio è necessario usare:</p>
<div class="codesnip-container" >
<div class="codesnip" style="font-family: monospace;">$ <span class="kw2">seq</span> <span class="nu0">10</span> <span class="nu0">-1</span> <span class="nu0">1</span></div>
</div>
<p>Con sort:</p>
<div class="codesnip-container" >
<div class="codesnip" style="font-family: monospace;">$ <span class="kw2">seq</span> <span class="nu0">1</span> <span class="nu0">20</span> | <span class="kw2">sort</span> -rn<br />
<span class="re3"># Attenzione, è diverso da <span class="kw2">seq</span> <span class="nu0">1</span> <span class="nu0">20</span> | <span class="kw2">sort</span> -r</span></div>
</div>
<p>Con tac (il contrario di cat):</p>
<div class="codesnip-container" >
<div class="codesnip" style="font-family: monospace;">$ <span class="kw2">seq</span> <span class="nu0">1</span> <span class="nu0">20</span> | <span class="kw2">tac</span></div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.simotrone.it/2009/11/24/bash-brace-expansion/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Preparazione di rodio</title>
		<link>http://www.simotrone.it/2009/05/06/preparazione-di-rodio/</link>
		<comments>http://www.simotrone.it/2009/05/06/preparazione-di-rodio/#comments</comments>
		<pubDate>Wed, 06 May 2009 06:55:04 +0000</pubDate>
		<dc:creator>Simotrone</dc:creator>
				<category><![CDATA[Binary People]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[FreeBSD]]></category>
		<category><![CDATA[rodio]]></category>
		<category><![CDATA[ssh]]></category>

		<guid isPermaLink="false">http://www.simotrone.it/?p=1837</guid>
		<description><![CDATA[Il bello di una box nuova, è che ce la si può personalizzare. Dopo aver ricompilato il kernel (quello FreeBSD m&#8217;è sembrato molto più semplice di quello Linux), rodio è stata sottoposta ad alcune modifiche necessarie. Installazione dai ports della shell bash, del bash completition e di vim, per cominciare. Altra cosa utile, è stato [...]]]></description>
			<content:encoded><![CDATA[<p>Il bello di una box nuova, è che ce la si può personalizzare.<br />
Dopo aver ricompilato il kernel (quello FreeBSD m&#8217;è sembrato molto più semplice di quello Linux), <strong>rodio</strong> è stata sottoposta ad alcune modifiche <em>necessarie</em>.</p>
<p>Installazione dai ports della shell bash, del bash completition e di vim, per cominciare.</p>
<p>Altra cosa utile, è stato attivare il server ssh.</p>
<pre>In /etc/rc.conf aggiungere la riga:
sshd_enable="YES"
Poi:
# /etc/rc.d/sshd start</pre>
<p>Altri programmi installati: lsof, mutt, nmap, portaudit, ssh2, wget.</p>
<p>E poi il webserver&#8230; Per provare questa volta mi sono dedicato a <a href="http://www.lighttpd.net/">lighttpd</a> &#8211; e mi è parso davvero simpatico. <img src='http://www.simotrone.it/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /><br />
(Grazie Jack per la dritta di secoli fa&#8230; che ho deciso di sfruttare ora.)</p>
<p>Riferimenti:<br />
* <a href="http://www.freebsd.org/docs.html">Documentazione su FreeBSD</a><br />
* <a href="http://www.freebsddiary.org/">FreeBSD Diary</a><br />
* Info su <a href="http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/openssh.html">Openssh</a>.</p>
<p>Se invece che compilare ogni singolo <a href="http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/ports-using.html">port</a>, si preferisce prendere i pacchetti precompilati, leggere <a href="http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/packages-using.html">qua</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.simotrone.it/2009/05/06/preparazione-di-rodio/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Colori del prompt</title>
		<link>http://www.simotrone.it/2008/08/13/colori-del-prompt/</link>
		<comments>http://www.simotrone.it/2008/08/13/colori-del-prompt/#comments</comments>
		<pubDate>Wed, 13 Aug 2008 06:38:04 +0000</pubDate>
		<dc:creator>Simotrone</dc:creator>
				<category><![CDATA[Binary People]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[colori]]></category>
		<category><![CDATA[prompt]]></category>

		<guid isPermaLink="false">http://www.simotrone.it/?p=679</guid>
		<description><![CDATA[Già tempo addietro avevo parlato dei colori di ls, legati indissolubilmente a quelli di bash. Ho deciso di sistemare un po&#8217; il prompt di root e user sulle diverse macchine (vedi ~/.bashrc, variabile PS1), anche se non sono ancora del tutto convinto. Visto che mi piacciono gli sfondi scuri (con scritte chiare), ho scelto il [...]]]></description>
			<content:encoded><![CDATA[<p><a href="/wp-content/img/prompt-color.jpg"><img src="/wp-content/img/prompt-color.th.jpg" alt="Colori dei prompt" align="right"/></a>Già tempo addietro avevo parlato dei <a href="http://www.simotrone.it/2008/01/06/usrbindircolors/">colori di ls</a>, legati indissolubilmente a quelli di bash.</p>
<p>Ho deciso di sistemare un po&#8217; il prompt di root e user sulle diverse macchine (vedi <strong>~/.bashrc</strong>, variabile <strong>PS1</strong>), anche se non sono ancora del tutto convinto. Visto che mi piacciono gli sfondi scuri (con scritte chiare), ho scelto il rosa per il percorso, e il ciano per le utenze; le box hanno colori diversi (per ora): idrogeno è giallo, neon è verde, radon lo farò blu chiaro.<br />
Non sono ancora convinto di voler tutto questo arcobaleno, ma magari mi setterò presto su qualcosa di leggibile.</p>
<p>Per la cronaca: l&#8217;utenza su Idrogeno ha la PS che segue:</p>
<blockquote><p>PS1=&#8217;\[\033[0;36m\]\u\[\033[1;00m\]@\[\033[1;33m\]\h\[\033[00m\]:\[\033[1;35m\]\w\[\033[00m\]\$ &#8216;</p></blockquote>
<p>mentre Neon ha questa:</p>
<blockquote><p>PS1=&#8217;\[\033[0;36m\]\u\[\033[1;00m\]@\[\033[1;32m\]\h\[\033[1;00m\]:\[\033[1;35m\]\w\[\033[1;00m\]\$ &#8216;</p></blockquote>
<p>Aggiungo il link ad un&#8217;utile guida di debianizzati.org: <a href="http://guide.debianizzati.org/index.php/Colorare_bash">Colorare bash</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.simotrone.it/2008/08/13/colori-del-prompt/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Fork Bomb</title>
		<link>http://www.simotrone.it/2008/02/03/fork-bomb/</link>
		<comments>http://www.simotrone.it/2008/02/03/fork-bomb/#comments</comments>
		<pubDate>Sun, 03 Feb 2008 10:50:41 +0000</pubDate>
		<dc:creator>Simotrone</dc:creator>
				<category><![CDATA[It's all, folks!]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[fork bomb]]></category>
		<category><![CDATA[malaware]]></category>

		<guid isPermaLink="false">http://www.simotrone.it/2008/02/03/fork-bomb/</guid>
		<description><![CDATA[Ho avuto modo di vedere una semplice fork bomb all&#8217;opera. Mi sembrava una cosa curiosa, e pensavo di scriverci un post&#8230; Poi ho aperto wikipedia&#8230; E vabbè. Qui c&#8217;è già tutto. Fatto sta, che è meglio non scrivere ){:&#124;:&#38;};: in console.]]></description>
			<content:encoded><![CDATA[<p>Ho avuto modo di vedere una semplice <strong>fork bomb</strong> all&#8217;opera.</p>
<p>Mi sembrava una cosa curiosa, e pensavo di scriverci un post&#8230; Poi ho aperto wikipedia&#8230;  E vabbè. <a href="http://it.wikipedia.org/wiki/Fork_bomb" target="_blank">Qui</a> c&#8217;è già tutto. <img src='http://www.simotrone.it/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Fatto sta, che è meglio <u>non</u> scrivere</p>
<blockquote>
<pre> <img src='http://www.simotrone.it/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' /> ){:|:&amp;};:</pre>
</blockquote>
<p>in console.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.simotrone.it/2008/02/03/fork-bomb/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>

