Sign in to follow this  
Michele Gazzaruso

Comandi basiliari della shell, aka "Terminal For Dummies"

Recommended Posts

Ho pensato di creare questa piccola mini guida date le numerose richieste sul forum relative all'uso del terminale.

Verranno trattati i comandi *basilari* con i loro altrettanto basilari switch. Per proseguire nell'argomento in modo più approfondito consiglio le numerose letture presenti su Google e/o gli innumerevoli manuali cartacei.

Il comando ls

Il comando ls mostra il contenuto di una directory. E' l'equivalente del comando "dir" nei sistemi MS-DOS/Windows.

Un esempio del comando ls:

Mini:Music Michele$ lsI Feel Dark.mp3	goccia.mp3	iTunes		iTunes MusicMini:Music Michele$ 

Un'opzione interessante del comando ls è lo switch -al. Così - in un sol colpo - saremo in grado di ordinare secondo un modello di visibilità più dettagliato e preciso (dimensione, permessi ecc.) il contenuto della directory, inclusi i files nascosti.

Un esempio del comando ls -al:

Mini:Music Michele$ ls -altotal 17408drwx------+  8 Michele  staff      272 23 Nov 02:01 .drwxr-xr-x+ 26 Michele  staff      884 24 Nov 15:51 [email protected]  1 Michele  staff     6148 23 Nov 17:46 .DS_Store-rw-r--r--   1 Michele  staff        0 25 Ott 00:24 [email protected]  1 Michele  staff  3875443  6 Nov 00:32 I Feel [email protected]  1 Michele  staff  4505516 16 Nov 17:05 goccia.mp3drwxr-xr-x   7 Michele  staff      238 24 Nov 04:34 [email protected]  1 Michele  staff        0 10 Nov 03:51 iTunes MusicMini:Music Michele$ 

Il comando pwd

Questo comando va lanciato senza ulteriori switch e ritorna il percorso di lavoro assoluto in cui ci troviamo.

Un esempio del comando pwd:

Mini:Music Michele$ pwd/Users/Michele/MusicMini:Music Michele$ 

Il comando cd

Come l'equivalente nei sistemi MS-DOS/Windows, questo comando ci permette di spostarci nelle directory.

Un esempio del comando cd:

Mini:Music Michele$ pwd/Users/Michele/MusicMini:Music Michele$ cd ..Mini:~ Michele$ pwd/Users/MicheleMini:~ Michele$ cd ..Mini:Users Michele$ pwd/UsersMini:Users Michele$ cd MicheleMini:~ Michele$ pwd/Users/MicheleMini:~ Michele$ cd ..Mini:Users Michele$ pwd/UsersMini:Users Michele$ cd Michele/Music/Mini:Music Michele$ pwd/Users/Michele/MusicMini:Music Michele$ 

I comandi rm, rmdir e mv

Questi comandi gestiscono i files all'interno delle directory. Il comando rm elimina uno o più files all'interno di una directory. Il comando rmdir elimina una o più (sotto)directory a patto che esse siano vuote. Il comando mv copia un file nella nuova locazione specificata e lo elimina da quella di partenza (in pratica lo sposta), se directory di partenza e di destinazione coincidono ma il nome cambia il comando mv semplicemente rinomina il file. Particolare attenzione merita lo switch -rf dato al comando rm: esso ci permette di eliminare ricorsivamente e *senza conferma* file e/o directory *anche piene*, quindi va usato con parsimonia e buon senso.

Esempi dei comandi sopra citati:

Mini:Music Michele$ ls -ltotal [email protected] 1 Michele  staff  3875443  6 Nov 00:32 I Feel Dark.mp3drwxr-xr-x  2 Michele  staff       68 24 Nov 16:11 directory_esempio-rw-r--r--  1 Michele  staff        0 24 Nov 16:09 [email protected] 1 Michele  staff  4505516 16 Nov 17:05 goccia.mp3drwxr-xr-x  7 Michele  staff      238 24 Nov 04:34 [email protected] 1 Michele  staff        0 10 Nov 03:51 iTunes MusicMini:Music Michele$ Mini:Music Michele$ cd directory_esempio/Mini:directory_esempio Michele$ pwd/Users/Michele/Music/directory_esempioMini:directory_esempio Michele$ Mini:directory_esempio Michele$ cd ..Mini:Music Michele$ rmdir directory_esempio/Mini:Music Michele$ lsI Feel Dark.mp3	esempio.txt	goccia.mp3	iTunes		iTunes MusicMini:Music Michele$ Mini:Music Michele$ mv esempio.txt esempio.aviMini:Music Michele$ lsI Feel Dark.mp3	esempio.avi	goccia.mp3	iTunes		iTunes MusicMini:Music Michele$ rm esempio.avi Mini:Music Michele$ lsI Feel Dark.mp3	goccia.mp3	iTunes		iTunes MusicMini:Music Michele$ 

Share this post


Link to post
Share on other sites

Il comando mkdir

Questo comando ci permette di creare una (o più, ricorsivamente, grazie allo switch -p) directory.

Un esempio del comando mkdir:

Mini:Music Michele$ ls -l

total 17392

[email protected] 1 Michele staff 3875443 6 Nov 00:32 I Feel Dark.mp3

[email protected] 1 Michele staff 4505516 16 Nov 17:05 goccia.mp3

drwxr-xr-x 7 Michele staff 238 24 Nov 04:34 iTunes

[email protected] 1 Michele staff 0 10 Nov 03:51 iTunes Music

Mini:Music Michele$ mkdir prova

Mini:Music Michele$ ls -l

total 17392

[email protected] 1 Michele staff 3875443 6 Nov 00:32 I Feel Dark.mp3

[email protected] 1 Michele staff 4505516 16 Nov 17:05 goccia.mp3

drwxr-xr-x 7 Michele staff 238 24 Nov 04:34 iTunes

[email protected] 1 Michele staff 0 10 Nov 03:51 iTunes Music

drwxr-xr-x 2 Michele staff 68 24 Nov 16:15 prova

Mini:Music Michele$ mkdir -p UsersDB/clients/

Mini:Music Michele$ cd UsersDB/clients/

Mini:clients Michele$ pwd

/Users/Michele/Music/UsersDB/clients

Mini:clients Michele$

Il comando top

Questo comando permette di monitorare i processi attivi sul nostro sistema in tempo reale.

Un estratto del comando top:

Processes:  55 total, 2 running, 53 sleeping... 198 threads             16:17:31Load Avg:  0.18,  0.09,  0.08    CPU usage: 24.76% user,  6.67% sys, 68.57% idleSharedLibs: num =    8, resident =   47M code,   24K data, 2660K linkedit.MemRegions: num =  5753, resident =  116M + 8492K private,   50M shared.PhysMem:  165M wired,  160M active,  124M inactive,  448M used,   59M free.VM: 5984M + 369M   41392(0) pageins, 17811(0) pageouts  PID COMMAND      %CPU   TIME   #TH #PRTS #MREGS RPRVT  RSHRD  RSIZE  VSIZE  380 top          4.6%  0:00.29   1    18     29  460K   188K  1048K    18M   308 bash         0.0%  0:00.10   1    14     19  300K   184K   956K    18M   307 login        0.0%  0:00.02   1    17     55  284K   228K  1064K    19M   306 Terminal    21.7%  0:05.63   3   100-   135 2168K+ 6844K  7444K+  334M   212 smbd         0.0%  0:00.00   1     8     55   64K  2264K   316K    23M   211 smbd         0.0%  0:00.13   1    17     55  164K  2264K  2184K    23M   206 AppleSpell   0.0%  0:01.89   1    38     31  672K  4792K  4880K    33M   203 Safari       0.0%  5:39.86  13   276    696   68M    16M    92M   445M   143 GrowlHelpe   0.0%  0:02.49   4   107    145 2068K  3660K  4748K   309M   142 nmbd         0.0%  0:00.12   1    14     28  120K   224K   892K    19M   132 usbmuxd      0.0%  0:00.00   2    21     26     0   184K   356K    19M   131 AirPort Ba   0.0%  0:00.08   3    75     90  408K  2056K  1752K   299M   130 iTunesHelp   0.0%  0:00.06   2    52     46  232K   732K  1208K   281M   125 ATSServer    0.0%  0:01.08   2    86    104  808K  3796K  3200K    43M   124 TabletDriv   0.0%  0:00.04   1    55     36  208K   744K  1104K   296M   123 Finder       0.0%  0:04.50   6   166    215 3580K  9388K    14M   351M 

N.B.: Per ritornare al prompt si deve premere Ctrl+C.

L'editor di testi nano

Questo è un semplice ma potente editor di testi. Possiamo editare, gestire, salvare e quant'altro.

Una volta dentro: Ctrl+X per uscire, Ctrl+O per salvare con nome. (Per gli altri comandi si veda la barra nella parte inferiore dello schermo). Per richiamarlo, digitare "nano" (senza virgolette).

Il manuale

I sistemi *nix sono equipaggiati con un ottimo manuale per tutti i comandi. Se ad esempio ne vogliamo sapere di più sul comando ls, basta dare da terminale un "man ls" (senza virgolette). Se vogliamo uscire dalla pagina del manuale (dopo averla letta usando i tasti freccia) premiamo il tasto "q". Se vogliamo sapere come usare il manuale, basta dare il comando "man man" (ancora senza virgolette).

Alcune videate del comando "man":

apropos(1)                                                          apropos(1)NAME       apropos - search the whatis database for stringsSYNOPSIS       apropos keyword ...DESCRIPTION       apropos  searches a set of database files containing short descriptions       of system commands for keywords and displays the result on the standard       output.AUTHOR       John  W.  Eaton  was  the  original  author  of man.  Zeyd M. Ben-Halim       released man 1.2, and Andries Brouwer followed  up  with  versions  1.3       thru  1.5p.   Federico  Lucifredi  <[email protected]>  is the current       maintainer.SEE ALSO       whatis(1), man(1).                              September 19, 2005                    apropos(1):

BASH(1)                                                                                                   BASH(1)NAME       bash - GNU Bourne-Again SHellSYNOPSIS       bash [options] [file]COPYRIGHT       Bash is Copyright (C) 1989-2005 by the Free Software Foundation, Inc.DESCRIPTION       Bash  is an sh-compatible command language interpreter that executes commands read from the standard input       or from a file.  Bash also incorporates useful features from the Korn and C shells (ksh and csh).       Bash is intended to be a conformant implementation of the Shell and Utilities portion of  the  IEEE  POSIX       specification (IEEE Standard 1003.1).  Bash can be configured to be POSIX-conformant by default.OPTIONS       In  addition  to  the single-character shell options documented in the description of the set builtin com-       mand, bash interprets the following options when it is invoked:       -c string If the -c option is present, then commands are read from string.  If there are  arguments  after                 the string, they are assigned to the positional parameters, starting with $0.       -i        If the -i option is present, the shell is interactive.       -l        Make bash act as if it had been invoked as a login shell (see INVOCATION below).       -r        If the -r option is present, the shell becomes restricted (see RESTRICTED SHELL below).       -s        If  the  -s  option is present, or if no arguments remain after option processing, then commands                 are read from the standard input.  This option allows the positional parameters to be  set  when                 invoking an interactive shell.       -D        A  list of all double-quoted strings preceded by $ is printed on the standard output.  These are                 the strings that are subject to language translation when the current locale is not C or  POSIX.                 This implies the -n option; no commands will be executed.       [-+]O [shopt_option]                 shopt_option  is  one of the shell options accepted by the shopt builtin (see SHELL BUILTIN COM-                 MANDS below).  If shopt_option is present, -O sets the value of that option; +O unsets  it.   If                 shopt_option  is  not  supplied, the names and values of the shell options accepted by shopt are                 printed on the standard output.  If the invocation option is +O, the output is  displayed  in  a:

Share this post


Link to post
Share on other sites

Si, ho cercato di semplificare al massimo.. come premesso non verranno trattati tutti i comandi *nix e i loro switch, ma una raccolta semplificata e funzionale per muovere i primi passi.

Spero che il risultato sia d'aiuto in primis per gli switcher ed in secondo luogo per coloro i quali non hanno mai avuto a che fare con il terminale (L'interfaccia di Mac OS X è stupenda, ma sapere un po' cosa succede "dietro le quinte" non guasta).

Ovviamente chiunque dovrebbe sentirsi libero di aggiungere il suo contributo ;)

Share this post


Link to post
Share on other sites

Bel lavoro! A questi comandi aggiungerei solo chmod che non ho mai capito come diavolo funzionasse (ammetto di essere stato anche pigro e di aver rifiutato il man).

A quando una bella guida AppleScript e, magari, anche una guida su Obj-C e Cocoa? :P

Share this post


Link to post
Share on other sites

Proseguiamo con la carrellata di comandi utili.

Il comando ifconfig

Questo comando consente di visualizzare (e qualora si abbia necessità configurare) le interfacce di rete presenti sulla nostra macchina. Possiamo ricavare informazioni relative ad IP di sottorete, IP pubblico (nel caso di interfaccia ppp), subnet mask, broadcast e quant'altro.

Un esempio del comando ifconfig:

Mini:~ Michele$ ifconfig en0en0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500	inet6 fe80::216:cbff:fea2:f0cd%en0 prefixlen 64 scopeid 0x4 	inet 192.168.1.11 netmask 0xffffff00 broadcast 192.168.1.255	ether 00:16:cb:a2:f0:cd 	media: autoselect (100baseTX <full-duplex,flow-control>) status: active	supported media: autoselectMini:~ Michele$ 

Il comando sudo

Talvolta siamo costretti ad utilizzare l'account di root (superuser) per svolgere determinate azioni di manutenzione, o mansioni più delicate (ad esempio eseguire comandi che tentano di aprire un socket di rete o scrivere su di esso). In tal caso dobbiamo agire da superutente, in inglese - appunto - su(peruser)do, semplificato: sudo.

N.B.: Questo comando va usato con parsimonia e dovrebbe essere utilizzato da chi sa veramente cosa sta facendo.

N.B. 2: Questo comando richiede l'inserimento della password di amministratore.

Un esempio del comando sudo:

Mini:~ Michele$ ifconfig en1 192.168.2.3ifconfig: ioctl (SIOCAIFADDR): permission deniedMini:~ Michele$ sudo ifconfig en1 192.168.2.3Password:Mini:~ Michele$ ifconfig en1en1: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500	inet 192.168.2.3 netmask 0xffffff00 broadcast 192.168.2.255	ether 00:14:51:ee:a9:31 	media: autoselect (<unknown type>) status: inactive	supported media: autoselectMini:~ Michele$ 

Share this post


Link to post
Share on other sites

Bel lavoro! A questi comandi aggiungerei solo chmod che non ho mai capito come diavolo funzionasse (ammetto di essere stato anche pigro e di aver rifiutato il man).

A quando una bella guida AppleScript e, magari, anche una guida su Obj-C e Cocoa? :P

In verità sto splittando in vari messaggi il "tutorial "perchè in un unico messaggio sarebbe risultato troppo dispersivo e sopratutto perchè quando premo "Invia replica" giustamente mi dice che il messaggio è troppo lungo, sarei arrivato a chmod dopo ma lo faccio ora. Il fatto è che questo e altri comandi necessitano di un cenno sulla logica dei permessi e dei privilegi in *nix.

Per il tutorial su AppleScript a dire il vero non sono molto preparato, so qualche rudimento ma non mi sono mai messo ad imparare questo linguaggio (è un lavoro che potrebbero fare numerose persone sicuramente più preparate di me sull'argomento, qui sul forum!). Per quanto riguarda invece la programmazione in Cocoa/Objective-C sarei felice di dare il mio contributo, magari con altre persone molto preparate, quali gennaro_mac, MacApp ed altri :)

(Il fatto è che ci vuole tempo, e quello purtroppo scarseggia un po' per tutti ahimè..)

Share this post


Link to post
Share on other sites

Cenni sulla logica dei privilegi in *nix

In *nix (quindi anche in Mac OS X) tutto è un filesystem. Anche quando inseriamo una pennetta USB, essa è vista come un filesystem. Un filesystem ha dei privilegi, di cui possono trarre beneficio utenti e/o gruppi. Senza entrare troppo nello specifico, pensiamo sempre alla piramide. In alto padroneggia il nostro amico root, man mano che si scende verso i "bassifondi" troviamo una stratificazione a gruppi. Primo piano della piramide (sotto root) ad esempio: potremmo trovare il gruppo "admin", un fittizio gruppo di coamministratori. Di questo gruppo fanno parte gli utenti Aldo, Giovanni e Giacomo. Il nostro amministratore (root) decide di agevolare il lavoro dei coamministratori e così piazza un file "mansioni.txt" nella directory condivisa fittizia di nome shared, ubicata in / (ovvero - quindi - /shared).

Root - però - è previdente e, seppur dando il permesso ai coamministratori di leggere e scrivere sul file (per vari scopi lavorativi fittizi), vuole dare il permesso di sola lettura di questo file al resto degli impiegati (potrebbe essere loro utile, diciamo).

Root utilizza il comando chmod (trattato in seguito) per modificare i *privilegi*, ovvero i permessi che possono venire applicati ad un file, relativi ad utente, gruppi, e tutto il resto.

Per visualizzare i permessi di un file dobbiamo usare lo switch -l per il comando ls.

Esempio:

Mini:shared Michele$ pwd/sharedMini:shared Michele$ ls -ltotal 0-rw-rw-r--  1 root  admin  0 24 Nov 17:57 mansioni.txtMini:shared Michele$ 

Esaminiamo da sinistra verso destra:

----------

0123456789

Abbiamo 10 bit da poter riempire.

Il primo bit (posizione 0) è speciale ed è riservato per indicare se un file è una directory o appunto un file. Nel caso di mansioni.txt è vuoto (c'è il trattino) quindi il file *non* è una directory, è quindi - appunto - un file.

I seguenti 9 bit dividiamoli in 3 gruppi da 3 bit ognuno. Ogni gruppo ha 3 bit, il primo bit di ogni gruppo può essere vuoto o può essere una r (read, lettura). Il secondo può essere vuoto o w (write, scrittura), il terzo può essere vuoto o x(eXecution, esecuzione/accesso(nel caso di una directory)). Il primo *gruppo* è relativo ai permessi dell'utente proprietario del file (solitamente chi lo ha creato), il secondo gruppo di bit è relativo al *gruppo di appartenenza* del file, il terzo gruppo è relativo a tutti coloro i quali non sono nè l'utente proprietario nè appartengono al gruppo di appartenenza. (In realtà il terzo bit di ogni gruppo può essere differente da x, ma allo scopo di questa mini guida sarebbe superfluo, consiglio a chi è interessato di approfondire su Google o con il prezioso man).

Proseguendo, dopo i privilegi troviamo il numero di file contenuti in questa directory (siccome nel nostro caso è un file, troviamo 1: il file stesso, per l'appunto). Di seguito eccoci rivelati il nome dell'utente proprietario (il nostro Root) ed il gruppo di appartenenza (admin). Vi sono poi informazioni relative a orario di creazione, dimensione del file, nome ecc.

Possiamo facilmente verificare, quindi, che che per "mansioni.txt" i privilegi sono i seguenti:

Per l'utente proprietario: Permesso di lettura e scrittura, ma non di esecuzione (il file non è un eseguibile, ma un file di testo. E non è neppure una directory)

Per il gruppo di appartenenza: Permesso di lettura e scrittura, ma non di esecuzione.

Per *chiunque altro*: Permesso di sola lettura.

Importante: Solo l'utente proprietario di un file può cambiare, tramite il comando chmod, i permessi relativi a quel file stesso.

Il comando chmod

Ecco ora come l'utente proprietario può cambiare i privilegi di un file. Il comando chmod lavora sulla bit mask dei privilegi o sui privilegi stessi. La sintassi che vedremo è la seconda (la prima richiederebbe nozioni troppo avanzate, non avrebbe senso per un lettore che conosce le UMASK leggere questa mini guida eheh)

La sintassi è:

chmod gruppo_di_bit_da_modificare +/- valore_dei_bit

Il gruppo dei bit può essere u, g, o (user, group, others) oppure a (all).

Il valore dei bit può essere r, w, x (ok, anche altri ma come spiegato prima questo è un tutorial di base).

Esempo del comando chmod:

Mini:shared Michele$ sudo chmod u+rw mansioni.txt Mini:shared Michele$ ls -ltotal 0-rw-------  1 root  admin  0 24 Nov 17:57 mansioni.txtMini:shared Michele$ sudo chmod g+rw mansioni.txt Mini:shared Michele$ ls -ltotal 0-rw-rw----  1 root  admin  0 24 Nov 17:57 mansioni.txtMini:shared Michele$ sudo chmod o+r mansioni.txt Mini:shared Michele$ ls -ltotal 0-rw-rw-r--  1 root  admin  0 24 Nov 17:57 mansioni.txtMini:shared Michele$ sudo chmod a-r mansioni.txt Mini:shared Michele$ ls -ltotal 0--w--w----  1 root  admin  0 24 Nov 17:57 mansioni.txtMini:shared Michele$ 

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this