Aptitude: differenze tra le versioni

Vai alla navigazione Vai alla ricerca
m
Riga 1: Riga 1:
==Intro==
{{stub}}
'''GNU Bash''' � la shell *nix probabilmente pi� ricca di funzionalit� sia per l'uso interattivo che per lo scripting. Spesso per� molte funzioni sono poco note.
== Introduzione ==


Questa pagina ha lo scopo di raccogliere il pi� ampio numero di "trucchi" pi� o meno noti riguardanti Bash, senza avere peraltro la pretesa di coprire tutte le funzionalit�.
Questa guida � dedicata all'uso di Aptitude.


==Per iniziare==
Il completissimo '''manuale utente di Aptitude''' in formato html si pu� trovare installando il pacchetto <tt>aptitude-doc-en</tt>, in <tt>/usr/share/doc/aptitude/html/en/index.html</tt>. Purtroppo il manuale � solo in inglese.
Prima di iniziare non posso non segnalare altre due guide presente sul wiki che danno dei tip molto utili su Bash:


* [[Come abilitare il completamento automatico 'avanzato']]
== Cos'� Aptitude ==
* [[Colorare bash]]


==Shell Interattiva==
Aptitude � un frontend per la gestione avanzata dei pacchetti di una distribuzione Debian, ma risulta valida per tutte le distribuzioni che supportano APT (http://www.debian.org/doc/manuals/apt-howto/ch-distros.it.html).
In questa sezione verranno elencate funzionalit� riguardanti l'uso interattivo di Bash.


===Navigare velocemente tra le directory===
Aptitude ormai lo strumento preferenziale per l'amministrazione dei pacchetti su Debian, in quanto non solo raggruppa in un unico semplice programma le funzionalit� di molti tool (apt-get, apt-cache ...) ma anche perch� permette di gestire in modo molto pi� facile (ed efficace) situazioni complesse (dipendenze, dipendenze inverse, rimozione pacchetti non utilizzati, ecc ...).
* Per andare sulla propria '''home''' basta digitare il comando '''cd''' senza nessun paramentro.
* Per tornare indietro alla precedente directory visitata sufficiente il comando '''cd -'''
* E possibile salvare un percorso con '''pushd''' e richiamarlo con '''popd'''. In realt� questi comandi (come il nome pu� fare intuire) implementano una coda FIFO (First In First Out) nella quale � possibile memorizzare un numero illimitato di percorsi per poi richiamarli dall'ultimo inserito in poi. Usare questi comadi � semplicissimo: basta usare '''pushd''' al posto di '''cd''' (in tal modo si memorizzano i percorsi via via visitati) e poi digitare '''popd''' una o pi� volte per tornare indietro.


===Riutilizzo degli argomenti===
Aptitude � un frontend a dpkg esattamente come apt-get, che sembra essere destinato a sostituire integralmente lo stesso [[Introduzione_all%27_Apt_System | apt-get (e affini)]], tanto che nelle release notes di Sarge si legge:
Bash memorizza l'ultimo argomento del comando precedente in una speciale variabile chiamata $_. E' possibile fare riferimento all'ultimo argomento dell'ultimo comando usando direttamente $_ ma la via di gran lunga pi� veloce � comoda � usare 'ESC .'.


Ecco un esempio stupido, creare un directory ed entrarvi:
{{Box|Citazione:|Il metodo di aggiornamento raccomandato fra le release Debian GNU/Linux prevede l'utilizzo dello strumento di gestione dei pacchetti aptitude. Tale strumento rende le decisioni riguardanti le installazioni dei pacchetti pi� sicure che l'esecuzione diretta di apt-get.}}
<pre>
$ mkdir /usr/local/nuovo-programma
$ cd ESC.
</pre>


Altro esempio forse un p� pi� utile, creare velocemente uno script:
e anche:
<pre>
$ :> /usr/local/bin/nomescript
$ chmod +x ESC.
$ gvim ESC.
</pre>


===Editing della linea di comando===
{{Box|Citazione:|Test di aggiornamento hanno mostrato che la versione di sarge di aptitude � migliore sia di apt-get sia della versione di woody di aptitude nella risoluzione di dipendenze complesse durante un aggiornamento.}}
Alcuni tasti di scelta rapida per l'editing da linea di comando:
: '''<tt>CTRL+a</tt>''': Vai all'inizio delle linea
: '''<tt>CTRL+e</tt>''': Vai alla fine della linea
: '''<tt>CTRL+k</tt>''': Cancella fino dalla posizione corrente alla fine della linea
: '''<tt>CTRL+u</tt>''': Cancella fino dalla posizione corrente all'inizio della linea
: '''<tt>CTRL+l</tt>''': Pulisce lo schermo
: '''<tt>META+f</tt>''': Vai una parola avanti
: '''<tt>META+b</tt>''': Vai una parola indietro
: '''<tt>META+d</tt>''': Cancella la parola successiva
: '''<tt>META+backspace</tt>''': Cancella la parola precedente


{{Box|Nota sul tasto META|Il tasto Meta pu� essere usato premendo ALT e ''contemporaneamente'' il carattere del comando che interessa, oppure premendo ESC e ''successivamente'' il tasto del comando che interessa. In quest'ultimo modo non � necessario permere due tasti conemporaneamente. Questa � una regola generica per gli shortcut di bash che usano il tasto Meta.}}
Si pu� utilizzare Aptitude in due modi: da linea di comando, cio� come apt-get (la sintassi e le opzioni sono identiche, o quasi), oppure tramite l'interfaccia utente basata sulle librerie ncurses.


===Uso avanzato dello storico===
Per l'uso da linea di comando si rimanda al manuale utente gi� citato, alla pagina di manuale (man aptitude) e all'apt-howto (aptitude install apt-howto-it, oppure http://www.debian.org/doc/manuals/apt-howto/index.it.html ), invece verr� trattata pi� diffusamente l'interfaccia utente, perch� si ritiene che sia uno strumento fondamentale per la gestione dei pacchetti e soprattutto per la diagnostica e la risoluzione degli eventuali problemi riscontrati.
Come noto Bash memorizza gli ultimi (solitamente 500 ma il numero � impostabile in $HISTSIZE) comandi digitati ai quali � possibile accedere semplicemente con le freccette SU e GIU. Tuttavia � possibile effettuare molte altre operazioni per ricercare nello storico dei comandi.


====Ricerca incrementale inversa====
{{Box|Prima di iniziare|Prima di iniziare a mettere le mani sulla tastiera, notiamo che aptitude, a differenza della maggior parte delle opzioni di apt-get, si pu� lanciare anche con i diritti di utente comune.  
Sotto questo astruso nome si cela la possibilit� di ricercare nello storico dei comandi semplicemente premendo CRTL+r e digitando qualche carattere del comando cercato. Verr� immendiatamente mostrato l'ultimo comando che soddisfa i criteri di ricerca. Se pi� comandi soddisfano la ricerca � possibile scorrerli (dall'ultimo al primo) premendo nuovamente CTRL+r.


Una volta trovato il comando lo si pu� eseguire con INVIO oppure editare con CTRL+j.
Poich� per l'effettiva installazione o rimozione dei pacchetti � necessario possedere i diritti di root, � possibile e caldamente consigliato usare questa possibilit� per effettuare qualunque prova, visto che non si sar� in grado di modificare neanche una virgola del sistema prima di aver inserito la password di root.}}


====Ricerca nella cronologia====
==Interfaccia utente==
Altra possibilit� � cercare tra tutti i comandi precedenti che cominciano con un certo gruppo di lettere.


Questa funzionalit� non � abilitata di default; bisogna modificare il file /etc/inputrc (o creare un analogo file .inputrc nella propria home), aggiungendo le righe:
La prima schermata che aptitude ci presenta, dopo che l'abbiamo lanciato da linea di comando, e dopo il caricamento delle informazioni attuali sui pacchetti ("caricamento della cache"), � divisa orizzontalmente in due parti.


<pre>
Nella parte superiore troviamo una zona a sfondo blu con un men� che propone diverse opzioni, e una zona a sfondo nero in cui si vede l'albero dei pacchetti disponibili, classificati in base al loro stato (installati, non installati, ecc.).
# PgUp/Down searches history in bash
"\e[5~":        history-search-backward
"\e[6~":        history-search-forward
</pre>


In questo esempio si � scelto di usare i tasti PGUP e PGDOWN.
Per vedere il contenuto di uno dei rami usiamo le frecce "su" e "giu" fino a selezionare la riga corrispondente e premiamo invio. Sotto al ramo in questione ora abbiamo dei sottorami, e premendo invio sui vari sottorami si accede allo stesso modo ai sotto-sottorami e cos� via, fino ad arrivare ai pacchetti.
Da notare che il file inputrc contiene altre comodit� pronte all'uso: basta decommentarle!


====Accesso diretto====
La parte inferiore � invece dedicata alla descrizione del pacchetto attualmente selezionato. Alcuni pacchetti, per esempio k3b, hanno una descrizione molto lunga: premendo TAB e usando le frecce � possibile leggerla tutta.
Il carattere ! permette di richiamare un preciso comando dello storico:


Ogni riga che mostra il nome di una pacchetto riporta anche molte informazioni.
Per esempio, riporto lo stato di alcuni pacchetti nel mio sistema (nota: il mio sistema una sarge, ma ho installato diversi pacchetti da testing e anche alcuni da unstable. Per informazioni sul pinning vedere [[APT_uso_avanzato:_mixare_releases_diverse | APT uso avanzato: mixare releases diverse ]]:
<pre>
<pre>
$ !-3
stato    nome                vers. attuale    vers. aggiornata
</pre>
 
richiama ed esegue il terzultimo comando, mentre:


<pre>
i        aptitude            0.2.15.9-2      0.2.15.9-2
$ !ta
i        amule                2.0.3-3          2.0.3-4
i A      amule-common        2.0.3-3          2.0.3-4
c        hotplug              <nessuna>       0.0.200403
p        apmd                <nessuna>        3.2.2-3
</pre>
</pre>


richiama ed esgue l'ultimo comando che comincia con '''ta''' (potrebbe essere: tail -f /var/log/messages). Il '''!!''' richiama invece l'ultimo comando.
Possiamo vedere che:
*aptitude � installato ed � alla versione pi� recente
*amule � installato ma � aggiornabile alla versione 2.0.3-4
*amule-common � installato per soddisfare una dipendenza (<tt>A</tt>), cio� solo a causa di un pacchetto che dipende da lui (amule). Anch'esso � aggiornabile
*hotplug non � installato, ma quando l'ho cancellato ho scelto di mantenere i file di configurazione (<tt>c</tt>)
*apmd non � installato (<tt>p</tt>)


Se si vuole richiamare il comando ma non eseguirlo si pu� usare il modificatore :p (''print''), ad esempio
Tramite semplici comandi si possono visualizzare molte altre informazioni. I comandi principali sono:
; v: visualizza le versioni disponibili per il pacchetto
; d: visualizza le dipendenze del pacchetto
; r: visualizza i pacchetti che dipendono dal pacchetto selezionato (dipendenze inverse)
; C: scarica da internet e visualizza il changelog del pacchetto
; q: chiudi la schermata attuale e passa a quella precedente


<pre>
Per una lista completa vedere la guida online con "?".
$ !ta:p
</pre>


stampa l'ultimo comando che inizia con ''ta''.
Ora premiamo invio su di un pacchetto: ci appare la schermata relativa al pacchetto, con la descrizione completa e molte altre informazioni, organizzate ad albero come abbiamo gi� visto. Se ci interessa qualche informazione su uno dei pacchetti che troviamo in questa schermata, lo selezioniamo e premiamo invio: appaiono le versioni disponibili del pacchetto. Se selezioniamo una delle versioni e premiamo invio ci ritroviamo nella schermata informativa di quel pacchetto. Fate attenzione perch� in questo modo si pu� perdere facilmente l'orientamento.
Torniamo alla vista dell'albero dei pacchetti premendo "q" tante volte quanto serve (se vi sbagliate e lo premete una volta in pi� vi chiede se volete uscire dal programma: per il momento dite di no ;-)).


Per richiamare l'ultimo comando che contiene una certa parola (non all'inizio):
==Aggiornare i pacchetti==
 
Per la descrizione dell'utilizzo di Aptitude user� come esempio una sessione reale, in cui vengono svolte alcune normali operazioni di aggiornamento e amministrazione dei pacchetti.
<pre>
Per prima cosa, nella nostra sessione di amministrazione, aggiorniamo le informazioni sui pacchetti disponibili. Con apt-get avremmo digitato apt-get update, mentre in aptitude � sufficiente premere "u".
$ !?parola?
</pre>


E' possibile anche richiamare un parametro di un comando usando ''':''' seguito dal numero del parametro (0 indica il comando stesso). Ad esempio:
Fate attenzione perch� aptitude non chiede conferma dopo che avete impartito un comando, quindi non digitate nulla senza prima essere sicuri/e di cosa state per fare.


<pre>
Dopo aver fatto l'update potremmo trovare una, due, o tre voci nuove nell'albero dei pacchetti: "Aggiornamenti di sicurezza", "Pacchetti aggiornabili", e "pacchetti nuovi". Per fare scomparire le prime due � necessario aggiornare tutti i pacchetti contenuti nei rispettivi rami, mentre per far sparire la terza � sufficiente premere "f" (forget).
$ man !-1:0
</pre>


visualizza la pagina di manuale dell'ultimo comando.
Ora torniamo ai pacchetti mostrati prima e supponiamo di voler aggiornare amule: lo seleziono e premo "+". Questo marcher� in verde, cio� per l'installazione, sia amule che amule-common. Poi per� mi viene un'idea migliore, e decido di aggiornare tutti i pacchetti aggiornabili, quindi digito "^" per risalire al ramo superiore della vista, finch� arrivo a <tt>Pacchetti installati</tt> poi uso la freccia in alto e se necessario risalgo ancora ai rami superiori finch� non arrivo a <tt>Pacchetti aggiornabili</tt> e qui premo "+". Questo marcher� per l'installazione tutti i pacchetti aggiornabili :-D


Per eseguire un comando con gli stessi argomenti del comando precedente:
==Risolvere eventuali problemi con delle dipendenze==


Dopo aver marcato per l'installazione tutti i pacchetti aggiornabili, aptitude mi segnala nella zona blu che c' un pacchetto "errato" cio con problemi di dipendenze. Senza battere ciglio premo "b" e vedo:
<pre>
<pre>
$ nuovocomando !!:1*
iB      udev          0.070    0.074
</pre>
</pre>
 
dove "B" significa "con errori", e sotto si legge:
==Bash Scripting==
In questa sezione verranno elencati alcuni brevi tip per lo scripting Bash. Questa non vuole essere assolutamente una guida completa, ma pi�ttosto un elenco di costrutti per lo scripting bash particolarmente eleganti, curiosi e/o poco noti.
 
===Variabili speciali===
 
; $? : Contiene il valore di uscita dell'ultimo comando o funzione. Il comando ha successo se ritorna zero, qualsiasi altro valore indica invece un codice di errore.
 
; $@ : Contiene la lista dei paramentri passati allo script corrente. Ogni parametro viene opportunamente quotato e questo permette l'utilizzo di questa variabile nei '''cicli for''' per processare (ad esempio) una lista di nomi di file che possono contenere anche spazi. L'uso di questa variabile � quindi in genere consigliato rispetto a '''$*''' che ha la stessa funzione ma non quota i vari parametri.
 
''Esempio:''
<pre>
<pre>
FILES=$@
Alcune dipendenze di udev non sono soddisfatte:


for file in $FILES; do
  *udev � in conflitto con module-init-tools (< 3.2pre9-1)
    # Fare quello che si vuole con $file
    echo $file 
    # ...
done
</pre>
</pre>
premo invio su udev, e mi appare la schermeta con tutte le informazioni su udev stesso, comprese le dipendenze: seleziono module-init-tools e premo invio. Ora mi appaiono tutte le versioni disponibili di module-init-tools, tra cui vedo che presente la 3.2pre9-1: non mi resta che selezionarla e marcarla per l'installazione :-D.
Quello che successo semplicemente che nel mio sistema udev in testing, e fino alla versione 0.070 funzionava bene con module-init-tools-3.2pre1-2, che invece in stable. Aggiornando tutto ho marcato per l'installazione il nuovo udev, versione 0.074, che per dipende da module-init-tools >= 3.2pre9-1. Poich questo pacchetto in testing, APT non ha potuto risolvere la dipendenza automaticamente: se un pacchetto in una distribuzione (e APT configurato nel modo giusto) non verr mai passato ad un'altra, a meno che non siate voi a farlo manualmente.


; $$ : PID del processo corrente.
Vorrei far notare che questo comportamento non � un bug, ma una cosa voluta: APT ha ricevuto un comando ambiguo e lo segnala generando un errore, proprio come noi ci aspettiamo da lui ;-).
 
In effetti, i reali colpevoli della generazione dell'errore siamo noi. Infatti, per permettere ad APT di gestire correttamente delle dipendenze in testing, dobbiamo semplicemente usare "testing" come distribuzione predefinita. Ricordate che abbiamo lanciato aptitude semplicemente con il comando "aptitude"? e ricorderete anche che il mio sistema � una sarge (stable). Questo equivale a lanciare aptitude con il comando "aptitude -t stable", da cui il nostro problema. Se avessimo usato "aptitude -t testing" aptitude avrebbe risolto correttamente la dipendenza, ma attenzione: in questo modo aptitude pensa che testing sia la nostra release predefinita (che non � vero) e mostrer� come aggiornabili tutti i pacchetti che lo sono in testin, cio� anche tutti quelli in stable (come peraltro ci aspettiamo che faccia ;-)).
; $! : PID dell'ultimo job in background
 
=== Manipolazione delle stringhe ===
Nelle shell *nix, storicamente, la manipolazione delle stringhe viene fatto attraverso programmi esterni alla shell come seq, awk e perl. Questi programmi vengono ancora usati quando si vuole mantenere la compatibilit� con la shell <tt>'''sh'''</tt>, tuttavia imparare anche il solo sed (il pi� semplice dei tre) non � cosa immediata.
 
Se si usa Bash, non � necessario usare nessun programma esterno, ma basta imparare i tre operatori fondamentali ed alcuni concetti di base, per poter fare tutte le manipolazioni pi� comuni.


In Bash una stringa non altro che una variabile, si indica dunque con <tt>${nome}</tt> oppure con la forma abbreviata <tt>$nome</tt>. Il nome dentro le graffe pu� essere seguito da un modificatore che manipola la variabile, ad esempio:
Il fatto � che aptitude, per quanto avanzato, ancora non legge il pensiero dell'amministratore, e fa solo il suo mestiere: prende tutte le decisioni ovvie autonomamente, e genera un errore quando non sa cosa decidere.


  VAR="stringa-di-esempio"
==Cercare un pacchetto==
  echo ${VAR#stringa-}


elimina "stringa-" dall'inizio della variabile.
Ora vorrei vedere se in debian c'� qualche programma per la gestione dei contenuti, e l'acronimo in inglese � "cms". Per fare questo posso usare le funzioni di ricerca di aptitude: per prima cosa digito ''''/'''' per la ricerca della stringa "cms" nei nomi dei pacchetti.


I modificatori sono molti, ma possono essere facilmente ricordati se si imparano i tre fondamentali:
Ora per� mi viene in mente che un cms non contiene necessariamente la stringa "cms" nel nome, quindi faccio una ricerca delle descrizioni per la stessa stringa: digito ancora ''''/'''' e inserisco "~dcms". Aptitude mi mostra il primo risultato della ricerca: per vedere il successivo premo ''''n'''' oppure ''''\''''.


; <tt>#</tt> : sottrae dall'inizio della stringa ''(minimale)''
Il comando ''''l'''', invece, funziona allo stesso modo di ''''/'''' ma mostra solo i pacchetti corrispondenti alla ricerca (a differenza di ''''/'''' che evidenzia nella lista il primo pacchetto corrispondente alla ricerca).
; <tt>%</tt> : sottrae dalla fine della stringa ''(minimale)''
; <tt>/</tt> : sostituisce una sottostringa con un altra ''(solo la prima volta che viene incontrata)''


Questi operatori sono minimali, questo vuol dire che se si usano le espressioni regolari per indicare la sottostringa (da eliminare o sostituire) verr individuata in caso di ambiguit la sottostringa pi piccola (o solo la prima nel caso della sostituzione).


Per ottenere gli operatori massimali basta raddoppiare il simbolo:
== Personalizzare la visualizzazione dei pacchetti ==
Con aptitude � possibile personalizzare sia i campi visualizzati nella lista dei pacchetti, sia il raggruppamento in sezioni e sotto-sezioni.


; <tt>##</tt> : sottrae dall'inizio della stringa ''(massimale)''
=== Personalizzare il raggruppamento in sezioni ===
; <tt>%%</tt> : sottrae dalla fine della stringa ''(massimale)''
Le sezioni nelle quali sono raggruppati i pacchetti quando si avvia Aptitude (e non solo) sono generate dinamicamente da un insieme di regole separate da virgola. E' possibile vedere e modificare le regole che generano la vista attuale premendo ''''G''''.
; <tt>//</tt> : sostituisce una sottostringa con un altra ''(tutte le volte che viene incontrata)''


Gli operatori massimali cercano di individuare la sottostringa pi� grande che corrisponde all'espressione regolare (nel caso del modificatore '''//''' tutte le sottostringhe vengono sostituite). Gli operatori di questo tipo vengono comunemente chiamati anche ''greedy (ingordi)''.
Le regole vengono elaborate in sequenza dalla prima all'ultima


Per una spiegazione dettagliata di tutti i modificatori e anche di altri modi di manipolare le stringhe in Bash (ad esempio <tt>expr</tt>) vedere:
Vediamo alcune regole:


* [http://www.tldp.org/LDP/abs/html/string-manipulation.html Advanced Bash-Scripting Guide: Manipulating Strings]
; <tt>filter(missing)</tt> : non visualizza i pacchetti che esistono solo nelle dipendenze di un altro pacchetto.


==== Esempi: manipolazione delle stringhe ====
; <tt>status</tt> : Raggruppa i pacchetti in:
:* Installati
:* Non installati
:* Aggiornamenti della sicurezza
:* Aggiornabili
:* Obsoleti
:* Virtuali


  VAR="questa.sarebbe.una.stringa.di.esempio"
; <tt>section[(''mode''[,passthrough])]</tt> : Raggruppa i pacchetti in base alla loro sezione. ''mode'' pu� assumere uno dei seguenti valori:
 
                      # Risultato:
 
  echo ${VAR#*.}      # --> sarebbe.una.stringa.di.esempio
  echo ${VAR##*.}    # --> esempio
 
  echo ${VAR%.*}      # --> questa.sarebbe.una.stringa.di
  echo ${VAR%%.*}    # --> questa
 
  echo ${VAR/st/ST}  # --> queSTa.sarebbe.una.stringa.di.esempio
  echo ${VAR//st/ST}  # --> queSTa.sarebbe.una.STringa.di.esempio
 
===Alternativa a basename===
Quando in uno script ci si deve riferire al nome dello script stesso � usuale utilizzare il comando (esterno a bash) '''basename'''. Tuttavia, tramite i modificatori del paragrafo precedente, Bash stessa � in grado di fornire questa funzionalit�. Basta usare l'espressione ${0##*/}.
 
Esempio:
<pre>
usage () {
        echo "usage: ${0##*/} "
        exit 1
}
</pre>


=== Cambiare l'estensione ai file ===
:; <tt>topdir</tt> : Raggruppa un base alla sezione dell'archivio debian (esempio: ''"main", "contrib", "non-free" ...'').
Rinomina tutti i file <tt>*.txt</tt> della directory corrente in <tt>*.log</tt>:
:; <tt>subdir</tt> : Raggruppa in base alla sezione logica (esempio: ''"adim", "base", "devel", "gnome", "kde", ecc ...'')
:; <tt>none</tt> : Raggruppa in base delle sezioni formate dalla somma delle  precedenti (esempio: ''"controb/admin", "contrib/devel", "non-free/admin", "non-free/devel").
:; <tt>task</tt> : Crea un albero dei pacchetti raggruppandoli per task.


for f in *.txt; do mv "$f" "${f/%txt/log}"; done
: Se viene usato il secondo parametro opzionale <tt>passthrough</tt> i pacchetti che per qualche motivo non hanno una sezione vengono passati alla regola successiva senza essere inseriti in categorie.


==Link==
All'avvio di aptitude, premendo ''''G'''' si pu� vedere che vengono usate le seguenti regole:
Link ad altre risorse su '''GNU Bash''':


* [http://www.gnu.org/software/bash/manual/bash.html Bash Referece Manual]: manuale ufficiale
  filter(missing),task,status,section(subdir,passthruough),section(topdir,passthrough)
* [http://www.tldp.org/LDP/abs/html/ Advanced Bash-Scripting Guide]: la '''Bibbia''' dello bash scripting.


----


Autore iniziale: [[Utente:TheNoise|~ The_Noise]]
In base a quanto detto la spiegazione di queste regole � semplice: ''visualizza solo i pacchetti reali, crea l'albero dei task, raggruppa i pacchetti per stato, per ogni stato raggruppa in sezioni logiche e all'interno di ogni sezione logica raggruppa in base alla sezione dell'archivio''.
223

contributi

Menu di navigazione