<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Shell on Melabit</title>
    <link>https://static.233.196.69.159.clients.your-server.de/it/tags/shell/</link>
    <description>Recent content in Shell on Melabit</description>
    <generator>Hugo</generator>
    <language>it</language>
    <lastBuildDate>Sun, 30 Dec 2018 18:00:00 +0000</lastBuildDate>
    <atom:link href="https://static.233.196.69.159.clients.your-server.de/it/tags/shell/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Script per tutti i giorni: shell e parametri</title>
      <link>https://static.233.196.69.159.clients.your-server.de/it/2018/12/30/script-per-tutti-i-giorni-shell-e-parametri/</link>
      <pubDate>Sun, 30 Dec 2018 18:00:00 +0000</pubDate>
      <guid>https://static.233.196.69.159.clients.your-server.de/it/2018/12/30/script-per-tutti-i-giorni-shell-e-parametri/</guid>
      <description>&lt;p&gt;&lt;img src=&#34;https://farm9.staticflickr.com/8002/7151170579_753c6fb9c0.jpg&#34; alt=&#34;&#34;&gt;&#xA;&amp;ndash; Foto: &lt;a href=&#34;https://www.flickr.com/photos/osr/&#34;&gt;Trammell Hudson&lt;/a&gt; su Flickr.&lt;/p&gt;&#xA;&lt;p&gt;Lo script di conversione del titolo di un post mostrato alla fine della &lt;a href=&#34;https://melabit.wordpress.com/2018/12/05/script-per-tutti-i-giorni-dalla-linea-di-comando-al-programma/&#34;&gt;puntata precedente&lt;/a&gt; è diventato ormai quasi &amp;ldquo;utilizzabile&amp;rdquo;. Mancano solo un paio di tocchi finali, che vedremo nel corso di questa terza parte.&lt;/p&gt;&#xA;&lt;h4 id=&#34;una-casa-per-i-programmi&#34;&gt;Una casa per i programmi&lt;/h4&gt;&#xA;&lt;p&gt;Prima di proseguire è bene decidere una volta per tutte dove salvare gli script che stiamo sviluppando. Non so voi, ma io preferisco usare una cartella dedicata allo scopo invece di buttare tutto dove capita. In tutti gli articoli di questa serie gli script in fase di sviluppo saranno salvati nella cartella &lt;code&gt;Development&lt;/code&gt;, situata all&amp;rsquo;interno della cartella &lt;code&gt;Home&lt;/code&gt; (o &lt;code&gt;Inizio&lt;/code&gt;) dell’utente che ha effettuato il login (la cartella &lt;code&gt;Home&lt;/code&gt; è quella rappresentata dall’icona di una casetta). Ovviamente siete liberi di usare un altro nome e un&amp;rsquo;altra posizione sul disco rigido, ma dovrete ricordarvi di modificare di conseguenza i percorsi dei comandi.&lt;/p&gt;&#xA;&lt;p&gt;Già che ci siamo, creiamo subito la cartella &lt;code&gt;Development&lt;/code&gt;. Se usate il Finder non ho bisogno di dirvi come si fa, se invece usate il Terminale basta eseguire i comandi&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ cd ~&#xA;$ mkdir Development&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;dove il primo comando, &lt;code&gt;cd ~&lt;/code&gt; (ma su macOS e varie versioni di Linux è sufficiente il semplice &lt;code&gt;cd&lt;/code&gt;) ci fa spostare nella nostra &lt;code&gt;Home&lt;/code&gt;, mentre il secondo comando crea la nuova directory &lt;code&gt;Development&lt;/code&gt;. Nelle shell Unix come &lt;code&gt;bash&lt;/code&gt;, il simbolo tilde &lt;code&gt;~&lt;/code&gt; (che si scrive premendo ALT-5) indica la &lt;code&gt;Home&lt;/code&gt; dell&amp;rsquo;utente.&lt;/p&gt;&#xA;&lt;p&gt;Volendo potremmo anche eseguire semplicemente&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ mkdir ~/Development&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;che crea la directory desiderata con un unico comando.&lt;/p&gt;&#xA;&lt;p&gt;Qualche breve nota generale. In questo contesto i termini &lt;em&gt;script&lt;/em&gt; o &lt;em&gt;programma&lt;/em&gt; sono equivalenti e li userò indifferentemente. Lo stesso vale per &lt;em&gt;directory&lt;/em&gt; e &lt;em&gt;cartella&lt;/em&gt;. Io preferisco il primo, ma so benissimo che, da quando esistono le interfacce grafiche, il termine &amp;ldquo;cartella&amp;rdquo; è diventato di uso molto più comune. Nel seguito cercherò di usare &amp;ldquo;cartella&amp;rdquo; nel testo discorsivo degli articoli e &amp;ldquo;directory&amp;rdquo; quando si tratterà di riferirsi ai comandi di &lt;code&gt;bash&lt;/code&gt; e al Terminale. Infine, il simbolo &lt;code&gt;$&lt;/code&gt; prima di ogni comando è il cosiddetto &lt;code&gt;prompt&lt;/code&gt; e serve ad indicare che stiamo interagendo con il Terminale; non fa parte dei comandi e quindi non deve mai essere inserito quando scriviamo un comando nel Terminale.&lt;/p&gt;&#xA;&lt;h4 id=&#34;andare-con-le-proprie-gambe&#34;&gt;Andare con le proprie gambe&lt;/h4&gt;&#xA;&lt;p&gt;Nella &lt;a href=&#34;https://melabit.wordpress.com/2018/12/05/script-per-tutti-i-giorni-dalla-linea-di-comando-al-programma/&#34;&gt;puntata precedente&lt;/a&gt; siamo arrivati ad usare uno dei tanti &lt;a href=&#34;https://melabit.wordpress.com/2018/12/05/script-per-tutti-i-giorni-dalla-linea-di-comando-al-programma/&#34;&gt;editor di testo&lt;/a&gt; disponibili su macOS per inserire queste righe di codice&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;string=&amp;#34;La privacy al tempo dell&amp;#39;Internet of Things: gran finale&amp;#34;&#xA; &#xA;fix_string=$(echo $string | tr &amp;#34;[:upper:]&amp;#34; &amp;#34;[:lower:]&amp;#34;)&#xA;fix_string=$(echo $fix_string | sed &amp;#34;s/&amp;#39;/ /g&amp;#34;)&#xA;fix_string=$(echo $fix_string | sed &amp;#34;s/[[:punct:]]//g&amp;#34;)&#xA;fix_string=$(echo $fix_string | sed &amp;#34;s/ /-/g&amp;#34;)&#xA; &#xA;converted_string=$fix_string&#xA;echo $converted_string&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Ora possiamo salvare lo script nella cartella &lt;code&gt;~/Development/&lt;/code&gt;, dandogli un nome significativo che ci aiuti a ricordare anche in un secondo momento cosa fa il programma. Molto meglio quindi usare un nome come &lt;code&gt;convert_title.sh&lt;/code&gt; piuttosto che un criptico &lt;code&gt;SCCUSIFJ.sh&lt;/code&gt;, anche se profuma tanto di DOS e di anni &amp;lsquo;80.&lt;/p&gt;&#xA;&lt;p&gt;Nei sistemi Unix come macOS l&amp;rsquo;estensione &lt;code&gt;.sh&lt;/code&gt; non è indispensabile ma ci aiuta a capire al volo che il file è uno script della shell (da cui &lt;code&gt;.sh&lt;/code&gt;). È possibile usare altre estensioni come &lt;code&gt;.shell&lt;/code&gt;, &lt;code&gt;.script&lt;/code&gt;, &lt;code&gt;.cmd&lt;/code&gt; o perfino &lt;code&gt;.bat&lt;/code&gt;, per il sistema operativo non cambia nulla.&lt;/p&gt;&#xA;&lt;p&gt;A questo punto possiamo finalmente di eseguire lo script. Lanciamo il Terminale, spostiamoci nella cartella dove abbiamo salvato lo script&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ cd ~/Development&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;ed eseguiamo lo script con il comando&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ sh convert_title.sh&#xA;la-privacy-al-tempo-dell-internet-of-things-gran-finale&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;ottenendo, come previsto, la trasformazione della stringa definita nella &lt;code&gt;string&lt;/code&gt; nel &lt;a href=&#34;https://melabit.wordpress.com/2018/11/23/script-per-tutti-i-giorni-semplici-modifiche-alle-stringhe-di-testo/&#34;&gt;formato adatto&lt;/a&gt; a Jekyll o a Wordpress.&lt;/p&gt;&#xA;&lt;p&gt;Per eseguire lo script dobbiamo premettere al nome del file il comando &lt;code&gt;sh&lt;/code&gt; che indica al sistema operativo che il file in questione contiene una serie di &lt;a href=&#34;https://melabit.wordpress.com/2014/11/06/script-di-shell-in-os-x/&#34;&gt;comandi di shell&lt;/a&gt;, cioè di comandi che permettono di interagire con il sistema operativo stesso (attenzione, il &lt;em&gt;comando&lt;/em&gt; &lt;code&gt;sh&lt;/code&gt; è una cosa ben diversa dall&amp;rsquo;&lt;em&gt;estensione&lt;/em&gt; &lt;code&gt;.sh&lt;/code&gt; vista prima!). Con questa informazione, il sistema operativo trasferisce l&amp;rsquo;esecuzione dello script alla shell di default, che in macOS e nella maggior parte dei sistemi Linux attuali è &lt;code&gt;bash&lt;/code&gt;. Niente però impedisce di &lt;em&gt;forzare&lt;/em&gt; l&amp;rsquo;utilizzo di &lt;code&gt;bash&lt;/code&gt;, scrivendo esplicitamente&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ bash convert_title.sh&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;al posto di &lt;code&gt;sh convert_title.sh&lt;/code&gt;, oppure di utilizzare &lt;a href=&#34;https://opensource.com/business/16/3/top-linux-shells&#34;&gt;altre shell&lt;/a&gt; eventualmente disponibili nel sistema, come &lt;code&gt;tcsh&lt;/code&gt;, &lt;code&gt;ksh&lt;/code&gt;, &lt;code&gt;zsh&lt;/code&gt; o &lt;code&gt;fish&lt;/code&gt; (argomento che non verrà trattato in questa serie).&lt;/p&gt;&#xA;&lt;p&gt;Purtroppo affidarsi alla configurazione di default del sistema può creare problemi, ad esempio perché qualcuno ha cambiato la shell di default, magari solo per fare una prova, dimenticando di ripristinare la configurazione iniziale. Per fortuna in genere queste cose non succedono per cui possiamo stare relativamente tranquilli. Però il meccanismo appena descritto non è né semplice, né tanto meno a prova di bomba.&lt;/p&gt;&#xA;&lt;p&gt;Proviamo a semplificarci la vita con due piccole modifiche. Prima di tutto utilizziamo il comando &lt;code&gt;chmod&lt;/code&gt; per rendere &lt;em&gt;eseguibile&lt;/em&gt; lo script all’utente attuale del Mac&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ chmod u+x convert_title.sh&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;dove la &lt;code&gt;u&lt;/code&gt; indica l&amp;rsquo;utente che sta usando il Mac e il simbolo &lt;code&gt;+x&lt;/code&gt; significa che il file viene reso eseguibile (la &lt;code&gt;x&lt;/code&gt; sta per &lt;em&gt;eXecute&lt;/em&gt;). Se volessimo rimuovere questa autorizzazione, non dovremmo far altro che eseguire il comando duale&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ chmod u-x convert_title.sh`&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;Se invece volessimo autorizzare tutti gli utenti del Mac ad eseguire questo script, dovremmo scrivere&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ chmod a+x convert_title.sh&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;mentre per autorizzare solo gli utenti che fanno parte del nostro stesso gruppo di lavoro oppure tutti gli altri utenti fuori dal nostro gruppo di lavoro, dobbiamo usare rispettivamente &lt;code&gt;chmod g+x convert_title.sh&lt;/code&gt; oppure &lt;code&gt;chmod o+x convert_title.sh&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Ma queste sono finezze utili per i server a cui accedono decine e decine di utenti contemporaneamente, i Mac sono sostanzialmente macchine monoutente (o che gestiscono un numero molto ridotto di utenti), per cui &lt;code&gt;chmod u+x&lt;/code&gt; (o al massimo &lt;code&gt;chmod a+x&lt;/code&gt;) a noi basta e avanza.&lt;/p&gt;&#xA;&lt;p&gt;L&amp;rsquo;altra modifica utile è quella di indicare esplicitamente al sistema operativo quale shell vogliamo utilizzare per interpretare i comandi contenuti nel nostro script. Per farlo è sufficiente aggiungere all&amp;rsquo;inizio dello dello script la sequenza di caratteri &lt;code&gt;#!&lt;/code&gt;, il cosiddetto &lt;a href=&#34;https://en.wikipedia.org/wiki/Shebang_%28Unix%29&#34;&gt;shebang&lt;/a&gt;,&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt; seguita dal percorso completo al programma di shell che vogliamo usare.&lt;/p&gt;&#xA;&lt;!--&#xA;(per motivi che saranno chiari fra poco, è meglio inserire lo shebang e il percorso esattamente nella _prima_ riga dello script).&#xA;--&gt;&#xA;&lt;p&gt;Dato che qui usiamo &lt;code&gt;bash&lt;/code&gt;, il nostro script diventa&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;#!/bin/bash&#xA;&#xA;string=&amp;#34;La privacy al tempo dell&amp;#39;Internet of Things: gran finale&amp;#34;&#xA; &#xA;fix_string=$(echo $string | tr &amp;#34;[:upper:]&amp;#34; &amp;#34;[:lower:]&amp;#34;)&#xA;fix_string=$(echo $fix_string | sed &amp;#34;s/&amp;#39;/ /g&amp;#34;)&#xA;fix_string=$(echo $fix_string | sed &amp;#34;s/[[:punct:]]//g&amp;#34;)&#xA;fix_string=$(echo $fix_string | sed &amp;#34;s/ /-/g&amp;#34;)&#xA; &#xA;converted_string=$fix_string&#xA;echo $converted_string&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Ma come lo troviamo il percorso di &lt;code&gt;bash&lt;/code&gt;? C&amp;rsquo;è un comando anche per questo: &lt;code&gt;which&lt;/code&gt; seguito dal nome di un qualunque comando Unix restituisce proprio il percorso completo del comando all&amp;rsquo;interno del filesystem. Di conseguenza &lt;code&gt;which bash&lt;/code&gt; restituisce&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ which bash&#xA;/bin/bash&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;che è proprio ciò che dobbiamo inserire in testa allo script subito dopo lo shebang.&lt;/p&gt;&#xA;&lt;!--&#xA;Se la stringa `#!/bin/bash` è esattamente la prima riga dello script, al momento del salvataggio lo script diventa automaticamente eseguibile da tutti gli utenti del sistema, proprio come se avessimo usato il comando `chmod a+x convert_title.sh` descritto prima. Dal punto di vista della sicurezza non è il massimo, ma per i nostri piccoli script inoffensivi può andar bene così.&#xA;--&gt;&#xA;&lt;p&gt;Per verificarlo, basta provare a salvare lo script modificato con un nome diverso, diciamo &lt;code&gt;convert_title_v2.sh&lt;/code&gt; e rendiamolo esegubile con il comando &lt;code&gt;chmod a+x convert_title_v2.sh&lt;/code&gt; descritto prima.&lt;sup id=&#34;fnref:2&#34;&gt;&lt;a href=&#34;#fn:2&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;2&lt;/a&gt;&lt;/sup&gt; A differenza di &lt;code&gt;convert_title.sh&lt;/code&gt;, questo secondo script potrà essere eseguito senza dover premettere &lt;code&gt;sh&lt;/code&gt;&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ ./convert_title_v2.sh &#xA;la-privacy-al-tempo-dell-internet-of-things-gran-finale&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;Per una serie di ragioni che vedremo in una prossima puntata, dobbiamo però &lt;em&gt;aiutare&lt;/em&gt; il sistema operativo a trovare lo script aggiungendo esplicitamente il percorso allo script da eseguire. Poiché nei sistemi Unix (e non solo), il punto &lt;code&gt;.&lt;/code&gt; indica la cartella corrente (mentre il doppio punto &lt;code&gt;..&lt;/code&gt; si riferisce alla cartella che contiene la cartella corrente), scrivere &lt;code&gt;./&lt;/code&gt; immediatamente prima del nome dello script equivale a dire al sistema operativo che lo script si trova nella cartella corrente, che in questo caso è la cartella dove siamo &lt;em&gt;entrati&lt;/em&gt; all&amp;rsquo;inizio di questa puntata con il comando &lt;code&gt;cd ~/Development&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;h4 id=&#34;parametri-sulla-linea-di-comando&#34;&gt;Parametri sulla linea di comando&lt;/h4&gt;&#xA;&lt;p&gt;C&amp;rsquo;è ancora una cosa che non va bene. Ogni volta che vogliamo cambiare la stringa da convertire dobbiamo intervenire direttamente sullo script, modificando la variabile &lt;code&gt;string&lt;/code&gt;. Facendo così è facile sbagliare, e in ogni caso sarebbe molto più comodo rendere lo script indipendente dai dati sui quali deve operare (in questo caso la stringa da convertire).&lt;/p&gt;&#xA;&lt;p&gt;Non voglio entrare nei dettagli (ma ci sarà tempo per approfondire la questione), per ora basterà dire che per rendere lo script indipendente dalla stringa da trasformare è sufficiente assegnare a &lt;code&gt;string&lt;/code&gt; il valore della variabile convenzionale &lt;code&gt;$1&lt;/code&gt;&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;#!/bin/bash&#xA;&#xA;string=$1&#xA;&#xA;fix_string=$(echo $string | tr &amp;#34;[:upper:]&amp;#34; &amp;#34;[:lower:]&amp;#34;)&#xA;fix_string=$(echo $fix_string | sed &amp;#34;s/&amp;#39;/ /g&amp;#34;)&#xA;fix_string=$(echo $fix_string | sed &amp;#34;s/[[:punct:]]//g&amp;#34;)&#xA;fix_string=$(echo $fix_string | sed &amp;#34;s/ /-/g&amp;#34;)&#xA; &#xA;converted_string=$fix_string&#xA;echo $converted_string&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;L&amp;rsquo;interprete &lt;code&gt;bash&lt;/code&gt; assegna automaticamente alle variabili &lt;code&gt;$1&lt;/code&gt;, &lt;code&gt;$2&lt;/code&gt;, &amp;hellip; &lt;code&gt;$9&lt;/code&gt;, dette &lt;em&gt;parametri posizionali&lt;/em&gt;, i valori degli &lt;em&gt;argomenti&lt;/em&gt; dello script, cioè i valori dei parametri presenti sulla linea di comando subito dopo il nome dello script da eseguire.&lt;sup id=&#34;fnref:3&#34;&gt;&lt;a href=&#34;#fn:3&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;3&lt;/a&gt;&lt;/sup&gt; I diversi parametri sono separati da uno o più spazi, e se un parametro contiene degli spazi bisogna racchiuderlo fra virgolette, non importa se semplici &lt;code&gt;&#39;&lt;/code&gt; o doppie &lt;code&gt;&amp;quot;&lt;/code&gt; (però è preferibile &lt;del&gt;essere consistenti ed&lt;/del&gt; evitare di mescolare i due simboli).&lt;/p&gt;&#xA;&lt;p&gt;Salviamo lo script così modificato con il solito nome &lt;code&gt;convert_title.sh&lt;/code&gt; e torniamo al Terminale. Ora per usare lo script dobbiamo scrivere la stringa da convertire direttamente sulla linea di comando, subito dopo il nome del file, racchiudendola fra virgolette dato che la stringa contiene degli spazi (io preferisco usare le virgolette doppie)&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ ./convert_title.sh &amp;quot;La privacy al tempo dell&#39;Internet of Things: gran finale&amp;quot;&#xA;la-privacy-al-tempo-dell-internet-of-things-gran-finale&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;Naturalmente niente impedisce di trasformare stringhe molto più lunghe, come ad esempio un paragrafo di questo stesso articolo, l&amp;rsquo;unica limitazione è che la stringa non deve contenere dei caratteri di &lt;a href=&#34;https://it.wikipedia.org/wiki/Ritorno_a_capo&#34;&gt;&lt;em&gt;ritorno a capo&lt;/em&gt;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ convert_title.sh &amp;quot;Purtroppo affidarsi alla configurazione di default del sistema può creare problemi, ad esempio perché qualcuno ha cambiato la shell di default, magari solo per fare una prova, dimenticando di ripristinare la configurazione iniziale. Per fortuna in genere queste cose non succedono per cui possiamo stare relativamente tranquilli. Però il meccanismo appena descritto non è né semplice, né tanto meno a prova di bomba.&amp;quot;&#xA;purtroppo-affidarsi-alla-configurazione-di-default-del-sistema-può-creare-problemi-ad-esempio-perché-qualcuno-ha-cambiato-la-shell-di-default-magari-solo-per-fare-una-prova-dimenticando-di-ripristinare-la-configurazione-iniziale-per-fortuna-in-genere-queste-cose-non-succedono-per-cui-possiamo-stare-relativamente-tranquilli-però-il-meccanismo-appena-descritto-non-è-né-semplice-né-tanto-meno-a-prova-di-bomba&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;Se guardiamo attentamente il risultato della conversione notiamo come lo script non riesce a trattare correttamente i caratteri accentati, come era stato già notato esplicitamente nella &lt;a href=&#34;https://melabit.wordpress.com/2018/11/23/script-per-tutti-i-giorni-semplici-modifiche-alle-stringhe-di-testo/&#34;&gt;prima puntata&lt;/a&gt; di questa serie di articoli. Per ora sarà sufficiente evitare di usare i caratteri accentati o almeno scriverli con una vocale seguita da un apostrofo, come se stessimo usando una tastiera americana.&lt;/p&gt;&#xA;&lt;h4 id=&#34;conclusioni-per-ora&#34;&gt;Conclusioni (per ora)&lt;/h4&gt;&#xA;&lt;p&gt;Se togliessimo l&amp;rsquo;estensione al nome del file, lo script &lt;code&gt;convert_title&lt;/code&gt; diventerebbe quasi indistinguibile dai comandi veri e propri del sistema operativo. Dico &amp;ldquo;quasi&amp;rdquo; perché per poterlo eseguire dobbiamo ancora premettere il percorso alla cartella corrente al nome del file. Ci sarà modo per risolvere questo (piccolo) problema, i più impazienti possono &lt;a href=&#34;https://melabit.wordpress.com/2014/11/06/script-di-shell-in-os-x/&#34;&gt;leggere qui&lt;/a&gt; per capire in anteprima come si fa.&lt;/p&gt;&#xA;&lt;p&gt;La prossima volta faremo un veloce ripasso dei comandi presentati in queste prime tre puntate, utile per consolidare quanto visto finora prima di passare ad usare uno degli strumenti più potenti ma anche meno conosciuti dell&amp;rsquo;arsenale Unix.&lt;/p&gt;&#xA;&lt;h5 id=&#34;revisioni&#34;&gt;Revisioni&lt;/h5&gt;&#xA;&lt;p&gt;&lt;strong&gt;30-12-2018&lt;/strong&gt;: Corretta una imprecisione relativa al cambiamento dei permessi dei file quando la prima riga di uno script contiene lo shebang e il percorso all&amp;rsquo;interprete &lt;code&gt;bash&lt;/code&gt; (si veda la nota 2).&lt;/p&gt;&#xA;&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;&#xA;&lt;hr&gt;&#xA;&lt;ol&gt;&#xA;&lt;li id=&#34;fn:1&#34;&gt;&#xA;&lt;p&gt;Detto anche &lt;em&gt;sha-bang&lt;/em&gt; o &lt;em&gt;hashbang&lt;/em&gt;.&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li id=&#34;fn:2&#34;&gt;&#xA;&lt;p&gt;Se la stringa &lt;code&gt;#!/bin/bash&lt;/code&gt; è esattamente la prima riga dello script, quando salviamo lo script l&amp;rsquo;editor TextMate lo rende eseguibile da tutti gli utenti del sistema, proprio come se avessimo usato esplicitamente il comando &lt;code&gt;chmod a+x ...&lt;/code&gt;. È una particolarità del solo TextMate, tutti gli altri editor che ho provato (Atom, BBEdit, Visual Studio Code e CotEditor fra quelli grafici, nano, emacs e vim per quanto riguarda gli editor testuali) non modificano mai i permessi del file.&amp;#160;&lt;a href=&#34;#fnref:2&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li id=&#34;fn:3&#34;&gt;&#xA;&lt;p&gt;Se abbiamo bisogno di più di nove parametri, dobbiamo racchiudere quelli dal decimo in poi fra parentesi graffe, scrivendo &lt;code&gt;${10}&lt;/code&gt;, &lt;code&gt;${11}&lt;/code&gt; e così via.&amp;#160;&lt;a href=&#34;#fnref:3&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;/div&gt;&#xA;</description>
    </item>
    <item>
      <title>Script per tutti i giorni: ricapitoliamo</title>
      <link>https://static.233.196.69.159.clients.your-server.de/it/2018/01/30/script-per-tutti-i-giorni-ricapitoliamo/</link>
      <pubDate>Tue, 30 Jan 2018 18:00:00 +0000</pubDate>
      <guid>https://static.233.196.69.159.clients.your-server.de/it/2018/01/30/script-per-tutti-i-giorni-ricapitoliamo/</guid>
      <description>&lt;p&gt;&lt;img src=&#34;https://farm4.staticflickr.com/3691/10922273715_cfd864963f_b.jpg&#34; alt=&#34;&#34;&gt;&#xA;&amp;ndash; Foto: &lt;a href=&#34;https://www.flickr.com/photos/ul_digital_library/&#34;&gt;Glucksman Library at Limerick&lt;/a&gt; su Flickr.&lt;/p&gt;&#xA;&lt;p&gt;Prima di proseguire con questa serie dedicata alla scrittura di piccoli script in &lt;code&gt;bash&lt;/code&gt; e affini, mi sembra utile ricapitolare i concetti principali delle prime tre puntate (qui i link alla &lt;a href=&#34;https://melabit.wordpress.com/2018/11/23/script-per-tutti-i-giorni-semplici-modifiche-alle-stringhe-di-testo/&#34;&gt;prima&lt;/a&gt;, &lt;a href=&#34;https://melabit.wordpress.com/2018/12/05/script-per-tutti-i-giorni-dalla-linea-di-comando-al-programma/&#34;&gt;seconda&lt;/a&gt; e &lt;a href=&#34;https://melabit.wordpress.com/2018/12/30/script-per-tutti-i-giorni-shell-e-parametri/&#34;&gt;terza&lt;/a&gt; puntata).&lt;/p&gt;&#xA;&lt;h4 id=&#34;case-e-cartelle&#34;&gt;Case e cartelle&lt;/h4&gt;&#xA;&lt;p&gt;Come tutti i sistemi basati su Unix, anche macOS è progettato per essere usato da più utenti, anche in contemporanea. Nella pratica non è così, nella maggior parte dei casi il Mac è usato da un solo utente e solo di rado vengono attivati degli account per più di tre o quattro utenti, però la funzionalità c&amp;rsquo;è.&lt;/p&gt;&#xA;&lt;p&gt;Di conseguenza ciascun utente del Mac dispone di un&amp;rsquo;area personale dove salvare tutti i documenti, dati e file di configurazione, nettamente separata da quelle degli eventuali altri utenti del sistema. Non a caso quest&amp;rsquo;area personale è denominata &lt;code&gt;Home&lt;/code&gt;, la &lt;em&gt;casa&lt;/em&gt; dell&amp;rsquo;utente.&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;&#xA;&lt;p&gt;Dal punto di vista pratico l&amp;rsquo;area personale di ciascun utente è costituita da una cartella, rappresentata dall&amp;rsquo;icona di una casetta e denominata con il &lt;code&gt;nome account&lt;/code&gt; (o &lt;code&gt;nome breve&lt;/code&gt;), cioè con il nome utilizzato per fare il login sul Mac, che viene assegnato all&amp;rsquo;utente una volta per tutte al momento della creazione dell&amp;rsquo;account. All&amp;rsquo;interno di questa cartella principale ci sono un certo numero di cartelle standard gestite automaticamente dal sistema operativo,&lt;sup id=&#34;fnref:2&#34;&gt;&lt;a href=&#34;#fn:2&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;2&lt;/a&gt;&lt;/sup&gt; ma niente impedisce di definire delle ulteriori cartelle personali. Io ad esempio uso la cartella &lt;code&gt;Documenti&lt;/code&gt; solo per i file generati automaticamente da certe applicazioni e conservo tutti i miei documenti in alcune cartelle ben definite contenute nella mia &lt;code&gt;Home&lt;/code&gt;, dentro le quali ci sono un gran numero di sottocartelle più specifiche.&lt;/p&gt;&#xA;&lt;p&gt;Una delle cartelle contenute nella mia &lt;code&gt;Home&lt;/code&gt; è &lt;code&gt;Development&lt;/code&gt;, che uso  da sempre per salvare i progetti generici relativi allo sviluppo software (quelli più strettamente collegati alla mia attività lavorativa sono altrove). Proprio per questo ho preferito salvare in questa cartella anche tutti i piccoli programmi proposti nel corso di questa serie, consigliando i lettori di fare altrettanto in modo da seguire più facilmente gli esempi riportati. Chi preferisce usare una cartella diversa dovrà ricordarsi di modificare di conseguenza i percorsi dei comandi.&lt;/p&gt;&#xA;&lt;p&gt;Già che siamo in tema di &lt;em&gt;cartelle&lt;/em&gt;, ribadisco quello che ho scritto nella terza puntata. I termini &lt;em&gt;directory&lt;/em&gt; e &lt;em&gt;cartella&lt;/em&gt; sono perfettamente equivalenti, io preferisco usare il primo ma so benissimo che nell&amp;rsquo;uso comune prevale nettamente il secondo, non a caso in tutte le interfacce grafiche l&amp;rsquo;icona che rappresenta la directory è proprio quella di una cartella di documenti. Ho deciso quindi di uniformarmi all&amp;rsquo;uso comune e usare il termine &amp;ldquo;cartella&amp;rdquo; nel testo discorsivo degli articoli, ma di continuare ad utilizzare &amp;ldquo;directory&amp;rdquo; quando il discorso si fa più tecnico, ad esempio ogni volta che tratterò di comandi dei &lt;code&gt;bash&lt;/code&gt; e del Terminale.&lt;/p&gt;&#xA;&lt;h4 id=&#34;il-terminale-di-macos&#34;&gt;Il Terminale di macOS&lt;/h4&gt;&#xA;&lt;p&gt;Chi legge i miei post sa che uso moltissimo il Terminale, l&amp;rsquo;interfaccia  a linea di comando di macOS, e lo considero uno strumento insostituibile quando si tratta di eseguire compiti complessi e ripetitivi. Provate ad usare un programma con interfaccia grafica per convertire un centinaio di immagini da un formato ad un altro, sovrapponendo a ciascuna immagine una scritta variabile e poi ditemi.&lt;/p&gt;&#xA;&lt;p&gt;In macOS il Terminale si trova nella cartella &lt;code&gt;Utility&lt;/code&gt;, posta all&amp;rsquo;interno della cartella &lt;code&gt;Applicazioni&lt;/code&gt;, un percorso che possiamo scrivere in modo più compatto come &lt;code&gt;Applicazioni &amp;amp;#62; Utility&lt;/code&gt;, dove il simbolo &lt;code&gt;&amp;amp;#62;&lt;/code&gt; indica il passaggio da una cartella ad un&amp;rsquo;altra contenuta al suo interno. Se lo usate spesso e vi secca doverlo andare a cercare ogni volta, aggiungetelo al Dock e vi basterà un click per lanciarlo.&lt;/p&gt;&#xA;&lt;p&gt;La prima (o la prossima) volta che usate il Terminale fatevi un favore e cambiate un paio di cosette nella sua configurazione standard.&lt;/p&gt;&#xA;&lt;p&gt;Innanzi tutto lanciate le Preferenze del Terminale, scegliete un profilo più gradevole di quello tutto bianco di base e rendetelo il profilo di default (io preferisco Ocean o Homebrew, ma è una questione di gusti personali). Per farlo, cliccate sull&amp;rsquo;icona Profili situata nella barra degli strumenti, selezionate dal pannello laterale sinistro il profilo che preferite e infine cliccate sul tasto &lt;code&gt;Default&lt;/code&gt; posto proprio in fondo al pannello. Se volete provare i vari profili prima di decidere quale vi piace di più, vi basta fare un doppio click sulle anteprime situate nel pannello laterale.&lt;/p&gt;&#xA;&lt;p&gt;Chissà perché Apple ha scelto per il Terminale una impostazione di default di appena 80 caratteri per 24 righe (80x24), forse voleva ricordarci come poteva essere lavorare sullo schermo di un &lt;a href=&#34;https://it.wikipedia.org/wiki/Apple_II&#34;&gt;Apple II&lt;/a&gt; (già in versione &amp;ldquo;espansa&amp;rdquo;)! Ma siamo in pieni anni 2000 e un Terminale più grande è decisamente più comodo. Per cui, una volta selezionato il profilo grafico preferito, potete cambiare le dimensioni della finestra del Terminale selezionando il pannello &lt;code&gt;Finestra&lt;/code&gt; nell&amp;rsquo;area centrale delle Preferenze del Terminale e inserendo le dimensioni che preferite, in termini di righe e colonne. Io in genere uso finestre di Terminale da 120 colonne per 40 righe (120x40), forse mi ricorda qualcosa ma comunque mi sembra un buon equilibrio fra ingombro sullo schermo e comodità d&amp;rsquo;uso.&lt;/p&gt;&#xA;&lt;p&gt;Se non avete idea di quanto queste dimensioni in righe e colonne si traducano in dimensioni reali sullo schermo, rilanciate il Terminale (per attivare il profilo di default) e allargate la finestra finché non diventa grande abbastanza per i vostri gusti, esattamente come fareste con qualunque altra applicazione per macOS. Per rendere queste dimensioni le nuove impostazioni di default, non dimenticate di cliccare sulla voce &lt;code&gt;Utilizza impostazioni come default&lt;/code&gt; del menu &lt;code&gt;Shell&lt;/code&gt; (che potrei scrivere anche come &lt;code&gt;Shell &amp;amp;#62; Utilizza impostazioni come default&lt;/code&gt;, dove il simbolo &lt;code&gt;&amp;amp;#62;&lt;/code&gt; serve in questo caso a separare le voci di menu da selezionare in sequenza).&lt;/p&gt;&#xA;&lt;h4 id=&#34;il-prompt-del-terminale&#34;&gt;Il prompt del Terminale&lt;/h4&gt;&#xA;&lt;p&gt;Se l&amp;rsquo;avete chiuso, lanciate di nuovo il Terminale e guardate con attenzione la finestra che appare. È praticamente vuota, tranne due brevi righe di testo. Se non avete fatto altre modifiche alla configurazione del Terminale rispetto a quelle proposte qui sopra, nella prima riga c&amp;rsquo;è la data e l&amp;rsquo;ora correnti con l&amp;rsquo;indicazione del numero del terminale virtuale correntemente aperto, &lt;code&gt;ttys001&lt;/code&gt;, &lt;code&gt;ttys002&lt;/code&gt; e così via. Il Terminale di macOS, infatti, non è altro che un emulatore software dei terminali &lt;em&gt;fisici&lt;/em&gt; con i quali, fino agli anni &amp;lsquo;80, ci si collegava ai grossi computer delle università o delle aziende mediante un protocollo di comunicazione seriale analogo a quello delle &lt;a href=&#34;https://it.wikipedia.org/wiki/Telescrivente&#34;&gt;telescriventi&lt;/a&gt;. In inglese la telescrivente si chiama &lt;em&gt;Teletype&lt;/em&gt; o &lt;em&gt;TTY&lt;/em&gt; e l&amp;rsquo;acronimo è rimasto ancora in uso per indicare appunto i terminali, ormai diventati solo &lt;em&gt;virtuali&lt;/em&gt;, dei sistemi Unix come Linux e macOS.&lt;/p&gt;&#xA;&lt;p&gt;Nella seconda riga invece compare il nome del vostro Mac, quello che avete definito nel pannello &lt;code&gt;Condivisione&lt;/code&gt; delle &lt;code&gt;Preferenze di Sistema&lt;/code&gt;, seguito dai due punti e dal nome della directory corrente, che in questo momento dovrebbe essere la &lt;code&gt;Home&lt;/code&gt; del vostro account, rappresentata dal simbolo tilde, &lt;code&gt;~&lt;/code&gt; (in macOS la tilde si scrive premendo ALT-5). Subito dopo il nome della directory corrente c&amp;rsquo;è uno spazio, il vostro &lt;code&gt;nome account&lt;/code&gt; e infine il simbolo del dollaro, &lt;code&gt;$&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;nome-computer:directory nome-account$ &#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;Questa riga si chiama il &lt;code&gt;prompt&lt;/code&gt; del Terminale, riesce a dare parecchie informazioni utili in modo compatto e, volendo, può essere &lt;a href=&#34;http://osxdaily.com/2006/12/11/how-to-customize-your-terminal-prompt/&#34;&gt;modificata a piacere&lt;/a&gt; (mai capito perché, però se queste cose vi piacciono potete usare questo &lt;a href=&#34;http://bashrcgenerator.com/&#34;&gt;generatore online&lt;/a&gt;).&lt;/p&gt;&#xA;&lt;p&gt;Quando si descrivono i comandi della shell (che quasi sempre è &lt;code&gt;bash&lt;/code&gt;), il prompt del Terminale viene rappresentato spesso con il solo simbolo &lt;code&gt;$&lt;/code&gt;, tralasciando tutto quello che c&amp;rsquo;è prima. Non bisogna mai dimenticare che il &lt;code&gt;$&lt;/code&gt; (o l&amp;rsquo;intero prompt) serve solo a mettere in evidenza che stiamo usando il Terminale ma non fa parte dei comandi della shell, per cui non dobbiamo mai scriverlo quando interagiamo con il Terminale, magari copiando i comandi dagli articoli di questa serie.&lt;/p&gt;&#xA;&lt;h4 id=&#34;pillole-di-bash&#34;&gt;Pillole di bash&lt;/h4&gt;&#xA;&lt;p&gt;E veniamo finalmente ad alcuni fra i comandi principali di &lt;code&gt;bash&lt;/code&gt;. Primo fra tutti &lt;code&gt;cd&lt;/code&gt; che permette di muoversi fra le directory del disco rigido. Il comando &lt;code&gt;cd&lt;/code&gt; deve essere seguito dal percorso completo da seguire per arrivare alla directory desiderata, per cui&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ cd Development&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;ci fa passare nella cartella &lt;code&gt;Development&lt;/code&gt; (supponendo di partire dalla &lt;code&gt;Home&lt;/code&gt;), mentre&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ cd Music/iTunes&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;ci fa andare direttamente nella cartella &lt;code&gt;iTunes&lt;/code&gt; contenuta all&amp;rsquo;interno di &lt;code&gt;Music&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Se ci sentiamo persi, possiamo usare&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ cd&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;per tornare nella nostra &lt;code&gt;Home&lt;/code&gt;, oppure&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ pwd&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;per stampare nel Terminale il percorso completo della directory in cui ci troviamo. Tutti i percorsi riportati da &lt;code&gt;pwd&lt;/code&gt; partono dalla directory &lt;code&gt;/&lt;/code&gt;, la &lt;em&gt;radice&lt;/em&gt; (o &lt;em&gt;root&lt;/em&gt;) del disco rigido,&lt;sup id=&#34;fnref:3&#34;&gt;&lt;a href=&#34;#fn:3&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;3&lt;/a&gt;&lt;/sup&gt; per cui se ci troviamo nella &lt;code&gt;Home&lt;/code&gt; dell&amp;rsquo;utente &lt;code&gt;alice&lt;/code&gt;, l&amp;rsquo;esecuzione di &lt;code&gt;pwd&lt;/code&gt; restituirà&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ pwd&#xA;/Users/alice&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;dove, come abbiamo già visto, &lt;code&gt;alice&lt;/code&gt; è il &lt;code&gt;nome account&lt;/code&gt; dell&amp;rsquo;utente che ha effettuato il login sul Mac. Da notare che in macOS tutte le &lt;code&gt;Home&lt;/code&gt; degli utenti si trovano all&amp;rsquo;interno della directory &lt;code&gt;/Users&lt;/code&gt;, a differenza della maggior parte degli altri sistemi operativi basati su Unix (Linux e i vari BSD) che sono più banali ed usano &lt;code&gt;/home&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;E per sapere qual&amp;rsquo;è il nostro &lt;code&gt;nome account&lt;/code&gt;? C&amp;rsquo;è un comando anche per questo,&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ whoami&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;forse scritto da qualche filosofo esistenzialista.&lt;/p&gt;&#xA;&lt;p&gt;Con il comando &lt;code&gt;cd&lt;/code&gt; si utilizzano spesso delle abbreviazioni molto comode: &lt;code&gt;~&lt;/code&gt; che indica la nostra directory &lt;code&gt;Home&lt;/code&gt;, &lt;code&gt;.&lt;/code&gt; che indica la directory corrente (quella riportata da &lt;code&gt;pwd&lt;/code&gt;) e &lt;code&gt;..&lt;/code&gt; che invece indica la directory che contiene la directory corrente. Se in questo momento ci troviamo nella directory &lt;code&gt;~/Music/iTunes&lt;/code&gt;&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ cd ..&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;ci fa fare un passo &lt;em&gt;indietro&lt;/em&gt;  tornando a &lt;code&gt;~/Music&lt;/code&gt;, mentre&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ cd ~&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;ci fa tornare nella nostra &lt;code&gt;Home&lt;/code&gt; (ma basta anche il solo &lt;code&gt;cd&lt;/code&gt;).&lt;/p&gt;&#xA;&lt;p&gt;Un altro comando fondamentale di &lt;code&gt;bash&lt;/code&gt; è &lt;code&gt;echo&lt;/code&gt;, che stampa una stringa sul Terminale&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ echo &amp;quot;questa è una stringa&amp;quot;&#xA;questa è una stringa&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;Non è nemmeno necessario racchiudere la stringa fra virgolette, &lt;code&gt;echo&lt;/code&gt; stamperà sul Terminale tutto ciò che viene immediatamente dopo il comando, quindi va altrettanto bene scrivere&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ echo questa è una stringa&#xA;questa è una stringa&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;È molto comune utilizzare &lt;code&gt;echo&lt;/code&gt; per scrivere direttamente in un file invece che sul Terminale tramite l&amp;rsquo;operatore di redirezione &lt;code&gt;&amp;amp;#62;&lt;/code&gt;&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ echo &amp;quot;questa è una stringa&amp;quot; &amp;amp;#62; file.txt&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;Se il file &lt;code&gt;file.txt&lt;/code&gt; non esiste, &lt;code&gt;echo&lt;/code&gt; lo crea da zero e ci scrive dentro la stringa, altrimenti sovrascrive il contenuto precedente di &lt;code&gt;file.txt&lt;/code&gt; e lo sostituisce con la nuova stringa. Se vogliamo che il nome del file da creare contenga degli spazi lo dobbiamo racchiudere fra virgolette, non importa se semplici o doppie&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ echo &amp;quot;questa è una stringa&amp;quot; &amp;amp;#62; &amp;quot;file con spazi.txt&amp;quot;&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;Per scrivere con &lt;code&gt;echo&lt;/code&gt; in un file senza perdere il contenuto già esistente, dobbiamo usare l&amp;rsquo;operatore &lt;code&gt;&amp;amp;#62;&amp;amp;#62;&lt;/code&gt; che aggiunge (&lt;em&gt;append&lt;/em&gt;) una nuova stringa alla fine del file &lt;code&gt;file.txt&lt;/code&gt;&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ echo &amp;quot;questa è una stringa&amp;quot; &amp;amp;#62;&amp;amp;#62; file.txt&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;Anche in questo caso, se il file &lt;code&gt;file.txt&lt;/code&gt; non esiste &lt;code&gt;echo&lt;/code&gt; lo crea da zero e ci scrive dentro la stringa.&lt;/p&gt;&#xA;&lt;p&gt;Gli operatori di redirezione &lt;code&gt;&amp;amp;#62;&lt;/code&gt; e &lt;code&gt;&amp;amp;#62;&amp;amp;#62;&lt;/code&gt; assomigliano moltissimo ad un altro operatore che abbiamo incontrato più volte nel corso delle puntate precedenti, il &lt;code&gt;|&lt;/code&gt; (&lt;em&gt;pipe&lt;/em&gt;), che serve a fare in modo che l’output di un comando venga utilizzato come input del comando successivo. Come in questo caso&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ echo &amp;quot;questa è una stringa&amp;quot; | tr &amp;quot;[:lower:]&amp;quot; &amp;quot;[:upper:]&amp;quot;&#xA;QUESTA È UNA STRINGA&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;dove il primo comando &lt;code&gt;echo&lt;/code&gt; scrive una stringa e la invia a &lt;code&gt;tr&lt;/code&gt; che a sua volta la converte in caratteri maiuscoli e stampa il risultato finale sullo schermo.&lt;/p&gt;&#xA;&lt;p&gt;Sempre restando in tema di file, ci sono due comandi importantissimi ma piuttosto complicati, &lt;code&gt;chmod&lt;/code&gt; e &lt;code&gt;chown&lt;/code&gt;, che permettono rispettivamente di cambiare i permessi di lettura (&lt;code&gt;r&lt;/code&gt;), scrittura (&lt;code&gt;w&lt;/code&gt;) ed esecuzione (&lt;code&gt;x&lt;/code&gt;) dei file, e di assegnare la &lt;em&gt;proprietà&lt;/em&gt; di un file ad un determinato utente o gruppo di utenti. In questo momento non ha senso entrare nei dettagli dei due comandi, per ora basterà sapere che&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ chmod u+x script.sh&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;rende lo script &lt;code&gt;script.sh&lt;/code&gt; eseguibile da parte dell&amp;rsquo;utente corrente del Mac, mentre&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ chmod u-x script.sh&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;rimuove l&amp;rsquo;autorizzazione precedente. Invece&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ chmod a+x script.sh&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;rende lo script eseguibile da tutti gli utenti e il suo contrario&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ chmod a-x script.sh&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;impedisce a tutti gli utenti, quindi anche a noi stessi!, di eseguire lo script in questione.&lt;/p&gt;&#xA;&lt;p&gt;Per quanto riguarda &lt;code&gt;chown&lt;/code&gt;&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ chown alice file.txt&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;rende &lt;code&gt;file.txt&lt;/code&gt; di proprietà dell&amp;rsquo;utente &lt;code&gt;alice&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;I permessi di un file si possono verificare tramite &lt;code&gt;ls&lt;/code&gt;, un comando utilizzato di continuo in una qualunque sessione del Terminale per mostrare il contenuto di una directory, cioè tutti i file e le directory (per Unix non c&amp;rsquo;è differenza) che si trovano all&amp;rsquo;interno di una directory data. La directory su cui deve operare &lt;code&gt;ls&lt;/code&gt; va indicata subito dopo il comando, se non scriviamo niente &lt;code&gt;ls&lt;/code&gt; mostra il contenuto della directory corrente.&lt;/p&gt;&#xA;&lt;p&gt;Il comando &lt;code&gt;ls&lt;/code&gt; &lt;em&gt;liscio&lt;/em&gt; mostra il contenuto di una directory in forma di tabella, e l&amp;rsquo;unico modo per distinguere i file dalle directory è tramite l&amp;rsquo;estensione: normalmente i nomi dei file terminano con una estensione costituita da un punto e da tre lettere mentre le directory non hanno estensione (ma non è detto che sia sempre così). Ad esempio&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ ls ~&#xA;Applications  Documentation Library       My Documents  Public        Tmp&#xA;Desktop       Documents     Movies        Papers        Research      bin&#xA;Development   Downloads     Music         Pictures      Sites&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;elenca tutte i file e le directory contenuti nella &lt;code&gt;Home&lt;/code&gt; del mio Mac (in effetti compaiono solo delle directory). Usato così, &lt;code&gt;ls&lt;/code&gt; serve a poco. Molto meglio&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ ls -l&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;che mostra il contenuto di una directory in forma di lista invece che di tabella, riportando in più una serie di informazioni dettagliate su ciascun file (o directory).&lt;/p&gt;&#xA;&lt;p&gt;In particolare, la prima colonna contiene una sequenza di 10 simboli &amp;ndash; in genere &lt;code&gt;-&lt;/code&gt;, &lt;code&gt;d&lt;/code&gt;, &lt;code&gt;r&lt;/code&gt;, &lt;code&gt;w&lt;/code&gt;, &lt;code&gt;x&lt;/code&gt;, qualche rara volta anche &lt;code&gt;s&lt;/code&gt; o &lt;code&gt;S&lt;/code&gt; &amp;ndash; che ci dicono se abbiamo a che fare con un file o una directory e quali sono i permessi associati al file stesso (o alla directory).&lt;sup id=&#34;fnref:4&#34;&gt;&lt;a href=&#34;#fn:4&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;4&lt;/a&gt;&lt;/sup&gt;  Il trattino, &lt;code&gt;-&lt;/code&gt;, indica che il permesso corrispondente non è assegnato. I dettagli possono essere &lt;a href=&#34;https://en.wikibooks.org/wiki/A_Quick_Introduction_to_Unix/Permissions&#34;&gt;letti qui&lt;/a&gt; o su una qualsiasi guida introduttiva a &lt;code&gt;bash&lt;/code&gt;, come quelle riportate nella Bibliografia qui sotto. A noi basta sapere che la &lt;code&gt;d&lt;/code&gt; in prima posizione indica una directory e che se troviamo una &lt;code&gt;x&lt;/code&gt; nella quarta, settima o decima posizione significa che il file è eseguibile rispettivamente dall&amp;rsquo;utente corrente, dagli utenti che fanno parte del suo stesso gruppo o infine da tutti gli utenti del Mac.&lt;/p&gt;&#xA;&lt;p&gt;Facciamo un esempio pratico: supponiamo di aver creato nella cartella &lt;code&gt;Development&lt;/code&gt; lo script &lt;code&gt;script.sh&lt;/code&gt;, contenente una serie di comandi &lt;code&gt;bash&lt;/code&gt;; appena creato lo script ha i permessi attribuiti di default a un file generico&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ ls -al script.sh &#xA;-rw-r--r--  1 nome-account  staff  0 Jan 25T22:07:00 script.sh&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;e poiché non troviamo nessuna &lt;code&gt;x&lt;/code&gt;, significa che non può essere eseguito da nessun utente. Per renderlo eseguibile dall&amp;rsquo;utente attuale del Mac&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ chmod u+x script.sh&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;come si vede eseguendo di nuovo &lt;code&gt;ls&lt;/code&gt;&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ ls -al script.sh &#xA;-rwxr--r--  1 nome-account  staff  0 Jan 25T22:07:00 script.sh&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;e notando che il &lt;code&gt;-&lt;/code&gt; in quarta posizione è diventato una &lt;code&gt;x&lt;/code&gt;. Se invece rendiamo il file eseguibile a tutti gli utenti con&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ chmod a+x script.sh&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;l&amp;rsquo;output di &lt;code&gt;ls&lt;/code&gt; sarà&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ ls -al script.sh &#xA;-rwxr-xr-x  1 nome-account  staff  0 Jan 25T22:07:00 script.sh&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;dove si vede che i trattini in quarta, settima o decima posizione sono diventati delle &lt;code&gt;x&lt;/code&gt;. Per riportare tutto alla situazione iniziale&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ chmod a-x script.sh &#xA;$ ls -al script.sh &#xA;-rw-r--r--  1 nome-account  staff  0 Jan 25T22:07:00 script.sh&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;Prima di concludere questa lunghissima introduzione a &lt;code&gt;bash&lt;/code&gt;, ecco alcuni comandi relativi alla creazione e cancellazione di file e directory. Per creare un file ci sono cento modi diversi, abbiamo già visto come farlo con &lt;code&gt;echo&lt;/code&gt;, ma possiamo utilizzare anche il comando &lt;code&gt;touch&lt;/code&gt;, che crea un file vuoto da utilizzare in un secondo momento, per cui&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ touch new_file.txt&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;crea il file vuoto &lt;code&gt;new_file.txt&lt;/code&gt; nella directory corrente.&lt;/p&gt;&#xA;&lt;p&gt;Per rimuovere un file si usa invece &lt;code&gt;rm&lt;/code&gt; seguito dal nome del file, quindi&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ rm new_file.txt&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;cancella il file che abbiamo appena creato con &lt;code&gt;touch&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Analogamente, per creare una directory si usa &lt;code&gt;mkdir&lt;/code&gt; (abbreviazione di &lt;em&gt;make directory&lt;/em&gt;), per rimuoverla &lt;code&gt;rmdir&lt;/code&gt; (abbreviazione di &lt;em&gt;remove directory&lt;/em&gt;), seguiti in entrambi i casi dal nome della directory da creare o da rimuovere&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ mkdir nuova_directory&#xA;$ rmdir nuova_directory&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;Anche in questo caso, se il nome della directory da creare (o da rimuovere) contiene degli spazi, deve essere racchiuso fra virgolette semplici o doppie. Per evitare errori che potrebbero essere disastrosi, si può rimuovere una directory solo se è vuota, cioè se non contiene altri file o altre directory.&lt;/p&gt;&#xA;&lt;p&gt;Credo che per ora possa bastare&amp;hellip;&lt;/p&gt;&#xA;&lt;h4 id=&#34;conclusioni&#34;&gt;Conclusioni&lt;/h4&gt;&#xA;&lt;p&gt;Questo articolo è cresciuto ben oltre le previsioni iniziali. Purtroppo era necessario farlo, sia per ricapitolare in modo organico le cose dette nelle prime tre puntate, sia per creare un linguaggio di base che permettesse di andare avanti più spediti, evitando di perdersi in troppi dettagli che rallentano e rendono più pesante l&amp;rsquo;esposizione. Alla prossima puntata con qualche cosa di nuovo e, spero, di interessante!&lt;/p&gt;&#xA;&lt;h4 id=&#34;bibliografia&#34;&gt;Bibliografia&lt;/h4&gt;&#xA;&lt;p&gt;I titoli su &lt;code&gt;bash&lt;/code&gt; si sprecano. Fra questi vorrei segnalare due guide in italiano e due in inglese. Purtroppo il materiale di qualità in italiano è scarso e le traduzioni dall&amp;rsquo;inglese sono per forza di cose molto più datate delle versioni originali (lo potete notare chiaramente confrontando le date delle versioni più recenti in italiano e in inglese della guida di Cooper), per cui è quasi sempre preferibile consultare i manuali e i tutorial originali in inglese. Per fortuna l&amp;rsquo;inglese &lt;em&gt;tecnico&lt;/em&gt; è molto comprensibile e non ci vuole molto per riuscire a leggerlo in modo fluido. Certo, se la scuola non facesse di tutto per renderlo odioso, le cose sarebbero più semplici per tutti.&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Garrels, &lt;a href=&#34;http://codex.altervista.org/guidabash/guidabash_1_11.pdf&#34;&gt;La guida di Bash per i principianti&lt;/a&gt;, 2008.&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Cooper, &lt;a href=&#34;http://www.pluto.it/sites/default/files/ildp/guide/abs/index.html&#34;&gt;Guida avanzata di scripting Bash&lt;/a&gt;, rev. 4.1, 2006.&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Cooper, &lt;a href=&#34;https://www.tldp.org/LDP/abs/html/index.html&#34;&gt;Advanced Bash-Scripting Guide&lt;/a&gt;, rev. 10, 2014.&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;Wikibooks, &lt;a href=&#34;https://en.wikibooks.org/wiki/A_Quick_Introduction_to_Unix&#34;&gt;A Quick Introduction to Unix&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;&#xA;&lt;hr&gt;&#xA;&lt;ol&gt;&#xA;&lt;li id=&#34;fn:1&#34;&gt;&#xA;&lt;p&gt;Purtroppo nella versione italiana di macOS è stata tradotta con &lt;code&gt;Inizio&lt;/code&gt;, che non rende altrettanto bene l&amp;rsquo;idea. Io non posso soffrire il termine &lt;code&gt;inizio&lt;/code&gt; e userò sempre &lt;code&gt;Home&lt;/code&gt;.&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li id=&#34;fn:2&#34;&gt;&#xA;&lt;p&gt;Fra cui &lt;code&gt;Filmati&lt;/code&gt;, &lt;code&gt;Immagini&lt;/code&gt; e &lt;code&gt;Musica&lt;/code&gt; per i file multimediali, &lt;code&gt;Download&lt;/code&gt; per i file scaricati da internet, &lt;code&gt;Documenti&lt;/code&gt; per i file personali e &lt;code&gt;Scrivania&lt;/code&gt; per i (troppi) file buttati alla rinfusa sul Desktop, cioè sulla scrivania virtuale del Mac.&amp;#160;&lt;a href=&#34;#fnref:2&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li id=&#34;fn:3&#34;&gt;&#xA;&lt;p&gt;O meglio, del &lt;em&gt;file system&lt;/em&gt; del disco rigido. Il disco rigido in sé è solo un oggetto hardware che non serve a molto finché non lo si &lt;em&gt;formatta&lt;/em&gt;, creando una struttura dati (il &lt;em&gt;file system&lt;/em&gt;, appunto) che possa essere utilizzata dal sistema operativo per memorizzare i file.&amp;#160;&lt;a href=&#34;#fnref:3&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li id=&#34;fn:4&#34;&gt;&#xA;&lt;p&gt;In macOS possono anche essere presenti i simboli &lt;code&gt;+&lt;/code&gt; o &lt;code&gt;@&lt;/code&gt; nell&amp;rsquo;undicesima posizione della colonna.&amp;#160;&lt;a href=&#34;#fnref:4&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;/div&gt;&#xA;</description>
    </item>
  </channel>
</rss>
