Importanza della Shell

Aperto da Gianky54, Domenica 08 Novembre 2009, 15:03:25

Discussione precedente - Discussione successiva

Gianky54

Linux ci ha ben abituati, poiché ci offre soluzioni talora anche semplici. Tuttavia è bene imparare a prendere confidenza con il terminale, visto che talvolta per risolvere un problema le soluzioni "automatiche" non bastano. Per questa ragione mi sonopermesso di postare una sintesi di comandi e suggerimenti atti a familiarizzare con la shell.
Naturalmente è un esperimento, suscettibile di critica e miglioramento da parte di tutti.

Nella tabella che segue vi sono le più comuni operazioni da eseguire da shell.
Notate in particolar modo il comando apt-get, col quale potete installare, aggiornare e rimuovere (disinstallare) pacchetti .deb.




alien -d nomefile.rpm   per convertire pacchetti rpm in .deb. Se non avete alien, scaricatelo da Synaptic.
apt-get clean   E' molto più radicale di "apt-get autoclean", poichè rimuove dalla cache di apt ogni file .deb, anche quelli relativi ai pacchetti correntemente installati. Generalmente non avete bisogno dei file .deb per i pacchetti installati, quindi potrebbe essere la cosa migliore se avete problemi di spazio.
apt-get autoremove    Pulizia pacchetti
apt-get install nomepacchetto    Installa il pacchetto. Puoi usare anche il gestore di pacchetti "Synaptic" che si trova nel menu per installare nuovi pacchetti
sudo apt-get -f install   Potreste avere bisogno di eseguire questo comando qualora, cercando di installare un pacchetto, vi venga restituito un errore di dipendenze irrisolvibili, nonostante questo pacchetto si trovi in Synaptic.

Può succedere ad esempio, se voi aggiungete nella vostra source.list un repository nuovo che contenga delle versioni aggiornate di pacchetti che avete gia in Synaptic. E' complicato spiegare come e quando questo può andarvi a dare problemi, ma vi basti sapere che con questo comando potreste risolvere i vostri problemi.
apt-get remove nomepacchetto    Rimuove il pacchetto (ma non i suoi file di configurazione). Si può usare anche Synaptic per la stessa funzione.
apt-get --purge remove nomepacchetto   Eseguendo apt-get remove verranno rimossi i pacchetti, ma non i loro file di configurazione, per eliminare anch'essi è necessario anteporre --purge a remove.

Tenete bene a mente questa istruzione perchè se avete dei problemi irrisolvibili a reinstallare un pacchetto, grazie a questo comando potreste risolvere tutto.
apt-get update   Aggiorna la lista dei pacchetti disponibili dai repositories.

Da eseguire in special modo ogni volta che avete cambiato le "liste dei repositoires", tipo /etc/apt/sources.list. Dopo avere eseguito questo comando è probabile che nella lista di Synaptic troviate del software nuovo da scaricare, che prima non avevate.

E' consigliabile eseguire l'update periodicamente per essere sicuri che le proprie liste rimangano sempre aggiornate.
apt-get upgrade   Aggiorna tutti i pacchetti installati.

È anche possibile aggiornare un singolo pacchetto attraverso l'esecuzione del comando: apt-get upgrade nomepacchetto
apt-get install build-essential   Build-essential è un pacchetto che si trova nei repository. In questo pacchetto vi stanno i compilatori di base, gcc, make, g++ e altro
apt-get install linux-headers-`uname -r`   Versione kernel in uso
dpkg --list   Elenca tutti i pacchetti installati
dpkg --list | grep gnome    Elenca tutti i pacchetti "gnome" installati.

dpkg è un gestore di pacchetti Debian. APT è considerato un gestore di pacchetti più avanzato rispetto a dpkg
dpkg-reconfigure nome_pacchetto   Problemi con un pacchetto, dovrebbe risolverlo. Tipo reinstallazione
tar -xvzf file.tar.gz    Scompattare tar.gz o tar.gz2. "x" è per estrarre, "v" sta per "verbose" cioè visualizza i file che vengono estratti, "z" è per filtrare l'archivio con gzip, "f" è perchè è un file archivio.
find . -name "*.tar" -exec tar xvf {} ;   Questo comando è utile se dovete decomprimere molti archivi tutti in una volta. Cerca (find) tutti files che finiscono per .tar (-name "*.tar") e per ognuno di questi ({}) esegue il tar xvf (-exec)

La direttiva -exec deve terminare per ;


Se dovete scompattare un archivio .rar ed avete difficoltà, potrebbe essere perchè dovete installare l'apposito pacchetto "rar" da Synaptic. Controllate da Synaptic se l'avete installato, altrimenti installatelo.

Quando del pacchetto che vi interessa non avete il .deb ma avete i "sorgenti", vi è una tipica procedura in linux per installarli, che è composta da tre comandi, da eseguire uno dopo l'altro:

  ./configure
    make
    sudo make install



in cui:
./configure    Con ./configure viene lanciato un script che si occupa di controllare se il sistema risponde ai requisiti richiesti come librerie e programmi (per esempio dei compilatori).
Si occupa anche di creare il Makefile, un file contenente delle variabili settate da ./configure (come la directory dove verrà installato il programma e il percorso delle librerie necessarie alla compilazione).
E' in questa fase che avvengono i maggiori problemi di installazione da sorgente. Infatti una libreria mancante causa quasi sempre un'errore e quindi l'interruzione del ./configure.

Anzichè scrivere semplicemente ./configure, potete anche scrivere:

    ./configure --prefix=/usr/local/

--prefix farà in modo che ./configure crei un makefile tale che il programma verrà installato dentro la cartella da noi indicata, in questo caso /usr/local/.
make   Make è il programma che si occupa di analizzare il file Makefile creato da ./configure e di compilare il programma.
Ma cosa ha di diverso il comando make dal comando gcc?
Make è concepito per compilare interi programmi, e ogni buon grosso programmone che si rispetti, è costituito da tanti, anche tantissimi file, magari di centinaia di mega, e compilare tutta questa roba può richiedere molto tempo.
Make fa questo lavoro per voi: spulcia le relazioni dei file che compongono il programmone nel "makefile" creato da ./configure e compila per voi tutta quella gran mole, generando dei file ".o" ("oggetto"), da ogni file sorgente e da questi, alla fine, ricava il da voi tanto desiderato file eseguibile.

Se anzichè "installare" state "reinstallando" sopra una precedente installazione del programmone, magari perchè volete semplicemente aggiornarlo, può capitare che "make" vi pianti in asso con un errore che non riuscite a capire..
Questo perchè make si ricontrolla ogni file sorgente e capisce, se dall'epoca ultima vostra compilazione, il file è cambiato oppure no e solo i file modificati saranno ricompilati, facendovi risparmiare moltissimo tempo. Ma allora perchè questo errore? Capita MOOOLTO di rado, tipo quando vi ricompilate il kernel o cercate di riaggiornare qualcosa con il metodo "svn".

E' complicato da spiegare il perchè questo errore si verifichi in queste situazioni, ma vi basterà sapere che la situazione si risolve facilmente: prima di eseguire il comando "make", scrivete: 

    make clean

Con questo comando vengono eliminati i precedenti file ".o" e potete fare una reinstallazione bella pulita del programmone..
sudo make install   Make install si occupa di andare ad installare (tramite il comando make) il programma sul nostro sistema.


Quella appena descritta è la procedura "classica" per installare un file a partire dai sorgenti.

In generale un programma in Linux, installato a partire da pacchetto o da sorgenti, sostanzialmente si sparpaglia fra le diverse cartelle di sistema di Linux.

I file di configurazione di questo programma, ad esempio, finiranno nella cartella "/etc/", che per convenzione è fatta apposta per contenere i file di configurazione del software che viene installato.

I file che non saranno soggetti ad ulteriori modifiche (quindi il programma vero e proprio) finiscono in genere in una qualche sottocartella di "/usr/share/" o "/usr/local/", mentre i file che subiscono modifica vanno in genere sotto "/var/".

Il file per lanciare il programma, ovvero "l'eseguibile", va in genere in "/bin/", le librerie vanno in genere sotto "/usr/lib/" o (piu raramente), sotto "/usr/libexec/".

Come potete vedere il programma si sparpaglia, ma in modo "razionale". Segue una logica che è regolata da uno standard chiamato "Filesystem Hierarchy Standard (FHS)".

Tuttavia a volte può capitare di avere qualche problema nel disinstallare il software, o perchè il programmatore del software non ha pensato a un sistema per la disinstallazione, o perchè comunque sia non riusciamo a rintracciare tutti i file installati.

Proprio per questo motivo è consigliata in Ubuntu una procedura di installazione da sorgenti che è diversa dalla solita triade di comandi "./configure && make && make install", e questa procedura è:

    sudo auto-apt run ./configure
    sudo make
    sudo checkinstall




auto-apt run   "auto-apt run" serve ad eseguire un comando ma sotto il controllo di auto-apt.

Auto-apt serve a fare in modo che se il programma che state installando manca di qualche file (in gergo si dice "ha problemi di dipendenze"), lui prova a cercare nel database dei pacchetti se esista un pacchetto che abbia il file che gli serve e ci chiederà se può installarlo. Il database può essere aggiornato con " auto-apt update ".

Attenzione però di non fare troppo affidamento alle capacità di ricerca di auto-apt per la risoluzione delle dipendenze in quanto in realtà piuttosto spesso lui fallisce nella sua ricerca e dobbiamo essere noi stessi a cercare il pacchetto che serve mediante Synaptic (cioè dobbiamo essere noi stessi, manualmente, a "risolvere le dipendenze"). Nonostante non sia infallibile vale sempre la pena di provare ad installare con auto-apt perchè male che vada può solo farci risparmiare del tempo.

auto-apt potrebbe non essere installato. In tal caso aprite Synaptic ed installatelo.

checkinstall   checkinstal l tiene traccia di tutti i file installati da make install o equivalenti, crea pacchetti Slackware, rpm o deb con tutti i file, e li aggiunge nel database dei pacchetti installati, permettendo di essere facilmente rimossi con il gestore dei pacchetti della distribuzione.


Dopo avere digitato "sudo auto-apt run ./configure" vedrete che il sistema opererà un controllo sui file che possiede. Se li possiede tutti, alla fine verrà generato il makefile che verrà usato dal successivo comando che digiterete, "sudo make" (in realtà make potrebbe essere eseguito anche senza "sudo", a meno che i nostri sorgenti non si trovino in una directory protetta da scrittura. Io lo uso lo stesso).

Se i file non sono tutti presenti non avrete il makefile per continuare l'installazione. In tal caso riguardatevi tutta la lista di operazioni eseguite su shell dopo il comando "sudo auto-apt run ./configure" e cercate cosa è che non trova. A questo punto scaricate voi stessi la roba mancante servendovi di Synaptic. Tutto questo può sembrare noioso ma è il prezzo che si deve pagare, spesso, nell'installazione da sorgenti.

A volte può essere difficile capire quale sia esattamente il file che manca.. Ad esempio l'esecuzione del nostro comando " auto-apt run ./configure " potrebbe terminare con un errore del tipo "SDL could not be found". In questo caso lui vi sta dicendo in realtà che ciò che non sta trovando sono le "librerie di sviluppo SDL".
Voi cercherete in Synaptic questo fantomatico pacchetto "SDL" che lui non trova e non lo troverete nemmeno voi, perchè in realtà quello che cerca è un pacchetto di nome "libsdl1.2-dev".

Si perchè in generale normalmente i file che mancano a ./configure in una installazione sono pacchetti di tipo "librerie per sviluppatore", che sono pacchetti che normalmente cominciano con la parola "lib" e finiscono con la parola "dev".

Quindi non appena vi si presenta un problema di dipendenze, partite sempre dal presupposto che molto probabilmente (spesso ma non sempre) il pacchetto che voi state cercando in realtà comincia con "lib" e termina con "dev"..

Se nonostante tutto avete ancora dei problemi a capire quale pacchetto manca ed è richiesto per completare una installazione, servitevi delle funzioni di ricerca di questo sito: http://packages.ubuntu.com/.

Utilizzando la procedura consigliata (cioè quella, che fa uso di auto-apt run, make, checkinstall), i sorgenti vengono trasformati in pacchetto in futuro facilmente eliminabile da Synaptic oppure da Shell digitando:
sudo dpkg -r nomepacchetto


Certo non pretendo di aver esaurito l'argomento... ed anzi per questo mi appello alla competenza ed esperienza di Amici indubbiamente più in gamba.
MINT LOVER

Facocero

Aspetto che qualcuno un pò più esperto di me puntualizzi anche le qualità di apt in luogo di apt-get in Linux Mint... ;)

Gianky54

Citazione di: Facocero il Domenica 08 Novembre 2009, 15:33:16
Aspetto che qualcuno un pò più esperto di me puntualizzi anche le qualità di apt in luogo di apt-get in Linux Mint... ;)

Intendi aptitude rispetto ad apt-get?
MINT LOVER

bobol


dieguitus

Io non saprei aggiungere molto; solo che pressoché tutti i comandi apt-get sopra elencati, in mint possono tranquillamente essere rimpiazzati dall'analogo, semplice 'apt'. Ben quattro caratteri in meno ogni volta ;)
In un articolo del nostro blog sono indicati dei recenti miglioramenti apportati a questo comando.

Pedro

#5
Volevo precisare solo una cosa che riguarda il seguente comando
Citazione./configure --prefix=/usr/local/
che nel senso e tutto guisto quello che dice doc anzi molte volte basta solo ./configure per avere l'installazione in /usr/local/,invece sarebbe meglio dare solo ./configure --prefix=/usr/ questo perché la maggior parte delle  librerie sono in /usr/lib/ e puo' capitare che l'applicazione installata in /usr/local/ non partira' perché non trova le librerie che avra' magari installato in /usr/local/lib/ invece di /usr/lib/,diciamo che basta copiare le librerie che eventualmente si sono installate in /usr/local/lib/ in /usr/lib/,ma se non si sa quali sono e meglio rimuovere l'applicazione eventualmente installata che non funge e rifare la compilazione con ./configure --prefix=/usr/.
Comunque leggete sempre il file install e/o il file Reademe dopo l'estrazione dei pacchetti dove ci sono molte informazioni utili per come fare e/o eventuali opzioni da dare per attivare alcune funzioni.


dieguitus

Citazione di: dieguito il Domenica 08 Novembre 2009, 16:21:00
Io non saprei aggiungere molto; solo che pressoché tutti i comandi apt-get sopra elencati, in mint possono tranquillamente essere rimpiazzati dall'analogo, semplice 'apt'. Ben quattro caratteri in meno ogni volta ;)
Mi accorgo appena ora che con il comando apt non è nemmeno necessario mettere il 'sudo'. Se sono richiesti i privilegi di amministratore vi chiederà automaticamente la pwd, altromenti no.
Per capirci, al posto di 'sudo apt-get-update' è sufficiente un 'apt update'.
Mica male, eh? ;)

panoramix

Salve,
è un'ottima tabella che permette di avere a portata di "occhi" tutti i comandi shell essenziali
Vivi come se dovessi morire oggi
Impara come se dovessi vivere sempre

lelio

Non sono sicuro di aver capito; in Mint ci sono apt e apt-get? se digito "man apt" dal terminale di karmic, di fatto non ho opzioni per la gestione pacchetti a disposizione

Pedro

Si, e come spiega dieguito nel post qua sopra non ce bisogno di mettere il sudo davanti ad apt.


lelio

E il fatto che non sia necessaria la PW non potrebbe creare dei problemi di sicurezza?

Pedro

Nessuno a detto che la password non è necessaria, ma solamente che sono stati semplificati questi comandi risparmiando ben 9 caratteri.
La domanda più corretta sarebbe: se do "apt update" (o qualsiai altro comando che parta con apt) non verra più chiesta la password ?
Risposta: la password verra chiesta sempre, come detto prima si è solo ridotto i numeri dei caratteri da battere.
 


lelio


Hotoko

Bè un po di caratteri in meno da digitare ....non possono che far piacere...!
Complimenti x la guida....

giasonetux

Hotoko, e se vai in "guide" ci sono altri comandi per il terminale. :ciao: