Archer_65
Utente
- Iscritto dal:
- 13 Marzo 2021
- Messaggi
- 60
GUIDA - Introduzione alla shell
Salve carissimi, oggi si friggono cervelli
No, torniamo seri, oggi cercherò di introdurvi la cosa più temuta dagli utonti: la shell. In particolare bash.
Requisiti
- Voglia di scervellarsi.
- ...
- ...
Precisazioni
- Non si intende sostituire un buon libro di testo.
- C'è bisogno di fare delle prove, quindi non leggete e basta, non vi resterà nulla di concreto.
- Non è difficile come sembra.
Introduzione
Prima dell'avvento di icone e finestre, la linea di comando permetteva l'interazione con la macchina. Sui sistemi UNIX chi interpreta e gestisce i comandi è la shell.
La shell fornisce un modo per creare script, eseguire programmi, compilare codice e molto altro. Sebbene possa sembrare poco intuitiva risulta molto più potente delle GUI (Graphical User Interface), offrendo funzioni avanzate che, altrimenti, non sarebbero accessibili.
Ce ne sono di diverse, ad esempio bash (Bourne Again Shell), zsh (Z Shell) e dash (nota per la sua velocità). Bash è usata in molte distribuzioni GNU/Linux e considerata uno "standard".
PROMPT
Se sul vostro sistema non è presente un'interfaccia grafica (o non funziona, per qualche oscura ragione), vi ritroverete il prompt dopo aver effettuato l'accesso.
Per un utente regolare:
Bash:
$
Bash:
#
Solitamente $ e # sono preceduti da informazioni quali username, data, nome dell'utente, directory corrente.
Esempio:
Bash:
[pinco@pallo ~] $
TERMINALE
Se avete un'interfaccia grafica potete aprire il terminale, ne esistono molti, quello preinstallato andrà benissimo.
NOTA: Potete anche personalizzarlo cambiando font, colori etc.
VIRTUAL CONSOLE
Le virtual console permettono di avere più sessioni della shell aperte, è possibile spostarsi tra queste con la combinazione CTRL+ALT e un tasto tra F1 e F6.
I comandi
Il modo più semplice per eseguire un comando è scriverlo da una shell, proviamo.
Bash:
$ date
Thu May 13 15:00:23 UTC 2021
Provate altri comandi, quali:
Comando | Significato |
---|---|
pwd | Mostra la directory corrente. |
hostname | Mostra l'hostname del computer. |
ls | Elenca i file e le cartelle nella directory corrente. |
La sintassi
Molti comandi hanno opzioni aggiuntive, utili per cambiare il comportamento del comando. Solitamente le opzioni consistono in una lettera preceduta da un trattino.
ESEMPIO:
Bash:
$ ls –l –a –t
$ ls –lat
Molte opzioni vengono rappresentate da un'intera parola preceduta da due trattini (--), ad esempio:
--help per l'opzione aiuto di molti comandi.
NOTA: Ci sono comandi che non seguono questa convenzione.
Molti comandi accettano anche argomenti, sono delle informazioni aggiuntive quali file, dispositivi, utenti, sulle quali il comando agisce. Esempio?
Bash:
$ cat /etc/passwd
NOTA: Questo comando mostra il contenuto del file /etc/passwd.
A volte gli argomenti sono posti immediatamente dopo un'opzione. Per opzioni a singola lettera, l'argomento segue dopo uno spazio. Per opzioni rappresentate da una parola intera, l'argomento segue un segno uguale (=).
ESEMPI:
Bash:
$ ls --hide=Documenti
Bash:
$ tar –cvf homecompressa.tar /home/pinco
PROVE:
Provate i seguenti comandi:
Bash:
$ ls
$ ls –a
Bash:
$ date
$ date +'%d/%m/%y'
NOTA: date --help per info aggiuntive.
L'identità
Effettuato l'accesso, si ha una identità, che include username, group name, user ID, group ID. Linux tiene traccia della tua sessione, sa quando hai effettuato l'accesso, per esempio.
Per avere informazioni su questa "identità":
Bash:
$ id
uid=1000(mario) gid=1000(mario) gruppi=1000(mario),998(wheel)
È possibile ottenere informazioni sulla sessione corrente utilizzando il comando:
Bash:
$ who -uH
NOME LINEA ORA IDLE PID COMMENTO
mario pts/1 2021-05-13 19:02 . 27843 (:0)
L'output mostra che l'utente mario sta usando lo pseudo terminale pts/1, IDLE mostra quanto a lungo la shell è rimasta aperta senza nessun comando digitato (il punto indica che, al momento, è attiva). PID mostra l'ID del processo, COMMENT il nome del computer dal quale è stato effettuato l'accesso (potrebbe essere un altro computer) o il nome del display locale X dal quale viene usato il terminale.
Dove sono questi comandi?
Bene, tutto molto carino, ma dove sono questi comandi? Per trovare i comandi digitati la shell fa riferimento al path. Per comandi non presenti nel path è possibile digitare il percorso del comando per esteso, basta conoscerlo.
Bash:
$ /bin/date
Per sapere qual è il PATH:
Bash:
$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/bin:/usr/lib/jvm/default/bin:/usr/bin/site_perl:/usr/bin/vendor_perl:/usr/bin/core_perl
Ogni percorso è separato dai due punti.
NOTA: Linux non controlla la directory corrente per l'esecuzione di un comando prima di cercare nel path, è bene notare che, se un comando non è presente in quest'ultimo, ci sarà bisogno di scrivere l'intero percorso (relativo o assoluto). Anche l'ordine è importante, i percorsi nel path sono controllati da sinistra a destra.
Ci sono comandi interni alla shell, altri possono essere "sovrascritti" creando alias personali.
"E quindi? Va come gli pare?"
Assolutamente no, ecco l'ordine:
- Alias. Nomi impostati dal comando alias. Digitando alias potete vedere quali alias sono impostati. Sono comodi per accorciare un comando particolarmente complicato.
- Parole riservate. Ci sono parole riservate alla shell. Alcune sono per fini "programmativi" (do, while, case, else).
- Funzioni. Set di comandi.
- Comandi interni. Non c'è una rappresentazione di questi nel filesystem, sono integrati nella shell, ad esempio: cd (cambia directory), echo (stampa), exit (per uscire da una shell), pwd (per indicare la directory corrente).
- Comandi nel filesystem. Il comando è eseguito dal filesystem del computer.
Bash:
$ type comando
Se un comando non è nel path, potete usare locate per provare a cercarlo (cercherà in qualsiasi parte del sistema accessibile dall'utente). Cercherà in tutto il filesystem. Se ci sono file aggiunti di recente updatedb (come utente root) aggiornerà il database di locate.
Completamento
È possibile risparmiare tempo (e battiture) grazie al completamento. Digitate qualcosa e poi premete il tasto TAB. Questo vale per: - Comandi, alias, funzioni.
- Variabili, se viene digitato $ prima.
- Username, se viene digitato ~ prima.
- Hostname, se viene digitato @ prima.
NOTA: Se vi sono più possibilità verranno mostrate tutte.
Richiamare comandi dalla cronologia
Editing di base
Il sistema di editing di bash è basato sull'editor emacs. È possibile anche usare i comandi dell'editor vi, ma non entreremo nel dettaglio, non questa volta.
Concentriamoci sullo stile emacs e proviamo un comando:
Bash:
$ ls /usr/bin | sort –f | less
Modifichiamo il comando.
- Freccia su. Mostra il comando più recente della cronologia.
- CTRL+A. Sposta il cursore all'inizio.
- CTRL+F o Freccia destra. Ripeti il comando per posizionarti dov'è presente il primo slash (/)
- CTRL+D. Digita questo comando quattro volte per cancellare /usr.
- Invio. Esegue il comando appena modificato.
Vi lascio qualche combinazione:
Combinazione | Significato |
---|---|
CTRL+F | Vai un carattere avanti. |
CTRL+B | Vai un carattere indietro. |
ALT+F | Vai una parola avanti. |
ALT+B | Vai una parola indietro. |
CTRL+A | Vai all'inizio. |
CTRL+E | Vai alla fine. |
CTRL+L | Pulisci. |
CTRL+D | Cancella carattere corrente. |
Backspace | Cancella carattere precedente. |
CTRL+T | Scambia carattere corrente e precedente. |
ALT+T | Scambia parola corrente e precedente. |
ALT+U | Parola in maiuscolo. |
ALT+L | Parola in minuscolo. |
ALT+C | Capitalizza parola. |
CTRL+V | Inserisci un carattere speciale. TAB = CTRL+V+TAB. |
CTRL+K | Taglia fino a fine linea. |
CTRL+U | Taglia fino a inizio linea. |
CTRL+W | Taglia parola precedente. |
ALT+D | Taglia parola successiva. |
CTRL+Y | Incolla il testo tagliato più recente. |
CTRL+C | Cancella la riga. |
Navigazione specifica
Abbiamo visto che è possibile modificare un comando dopo averlo richiamato, ma è possibile fare altro.
Bash:
$ history 3
123 ls
124 date
125 sudo pacman -Syyu
È possibile richiamare questi comandi ed eseguirli in un solo colpo con il punto esclamativo (!).
- !n Esegui comando numero. Basta rimpiazzare n con il numero desiderato.
Esempio:Bash:$ !32
- !! Esegui comando precedente.
- !?stringa? Esegui comando (più recente) contenente una stringa.
Esempio:Bash:$ !?dat?
Combinazione | Significato |
---|---|
Freccia su (CTRL+P) – Freccia giù (CTRL+N) | Naviga nella cronologia. |
CTRL+R | Permette di inserire una stringa e cercare a ritroso, apparirà un comando che corrisponde alla stringa inserita (se esiste), sarà possibile modificarlo e eseguirlo. |
CTRL+S | Come sopra, ma cerca in avanti (potrebbe non funzionare sempre). |
ALT+P | Simile a CTRL+R, ma non è incrementale, bisogna premere Invio. |
ALT+N | Come sopra, cerca in avanti (potrebbe non funzionare sempre). |
Esiste anche fc, basta digitarlo seguito da un numero (identificativo del comando) e verrà aperto un editor di testo (di default vi, per uscire digitare :wq o :q! per non salvare). Effettuate i cambiamenti e all'uscita il comando verrà eseguito.
NOTA: fc accetta anche un range (esempio, fc 32 35).
La cronologia è nel file .bash_history nella directory home. Di default vengono memorizzati 1000 comandi.
Comandi multipli
Connessione: PIPE
Pipe rende l'output di un comando l'input di un altro comando. Per esempio:
Bash:
$ cat /etc/passwd | sort | less
- Il comando cat elenca i contenuti del file /etc/passwd.
- L'output (tramite pipe) "diventa" input per il comando sort, che ordina alfabeticamente.
- L'output di sort "diventa" input per less.
Bash:
$ gunzip < /usr/share/man/man1/grep.1.gz | nroff –c –man | less
- Il contenuto del manuale del comando grep è diretto verso gunzip per essere estratto.
- L'output di gunzip diventa input per nroff (che formatta il manuale usando la macro –man.
- L'output di nroff a questo punto viene passato a less.
Sequenza: PUNTO E VIRGOLA
A volte si desidera eseguire una sequenza di comandi, è possibile farlo grazie a ;.
Bash:
$ date ; troff –me documento | lpr ; date
Perché farlo? In questo modo è possibile capire quanto tempo ha richiesto la formattazione del documento.
Background: AMPERSAND
Alcuni comandi richiedono un po' per il completamento, ma spesso vorremmo evitare di attendere prima di chiudere la shell. In questi casi torna utile ampersand (&) alla fine del comando, permette di eseguire un programma in background.
Comandi per formattare il testo quali nroff e troff sono un esempio, in caso di documenti particolarmente grandi.
Espansione
Comandi
È possibile rendere l'output di un comando argomento per un altro comando.
- $(comando)
- `comando`
Bash:
$ vi $(find /home | grep ciaomamma)
Utile se si conosce il nome del file ma non la sua posizione...
Espressioni aritmetiche
È possibile passare il risultato di un'espressione aritmetica a un comando. Ci sono due forme per fare ciò:
- $[espressione]
- $(espressione)
Bash:
$ echo "Ho $[2021 – 2000] anni"
Ho 21 anni.
Bash:
$ echo "Ci sono $(ls | wc –w) file in questa directory."
Provate.
Variabili
Variabili che conservano informazioni possono essere espanse tramite $. Il valore della variabile sarà stampato:
Bash:
$ ls –l $BASH
-rwxr-xr-x 1 root root 952720 9 mag 11.53 /bin/bash
La shell conserva informazioni utili nelle variabili. Esempi sono $SHELL (identifica la shell usata), $PS1 (che definisce il prompt della shell).
Tramite il comando set è possibile visualizzare tutte le variabili per la shell in uso. Le variabili d'ambiente si possono visualizzare con il comando env.
Con echo $VARIABILE è possibile ottenere il valore di una variabile.
Bash:
$ echo $USER
affred
Qui una tabella con variabili d'ambiente comuni:
Variabile | Descrizione |
---|---|
BASH | Contiene il percorso del comando bash. |
BASH_VERSION | Numero rappresentante la versione corrente di bash. |
EUID | User ID dell'utente, assegnato all'avvio della shell. |
FCEDIT | Questa variabile, se impostata, indica l'editor predefinito usato dal comando fc. Di default è vi. |
HISTFILE | Locazione della cronologia. Solitamente in $HOME/.bash_history. |
HISTFILESIZE | Numero delle voci che la cronologia può contenere, di default sono 1000. |
HISTCMD | Ritorna il numero del comando corrente nella cronologia. |
HOME | Directory home, solitamente è possibile tornarci digitando solo cd. |
HOSTTYPE | Valore che indica l'architettura del computer in uso. ES: x86_64. |
Locazione del file mailbox. Solitamente sotto /var/spool/mail/nomeutente. | |
OLDPWD | Directory di lavoro precedente. |
OSTYPE | Identifica il sistema operativo, solitamente qualcosa come linux o linux-gnu. |
PATH | Lista dei percorsi che definiscono il path. |
PPID | Process ID del comando che ha avviato la shell. |
PROMPT_COMMAND | Può essere impostato un comando da mostrare prima di mostrare il prompt della shell. |
PS1 | Valore del prompt, può contenere varie cose. Esistono anche PS2, PS3 etc. |
PWD | Directory corrente. |
RANDOM | Genera un numero casualmente tra 0 e 99999. |
SECONDS | Secondi passati dall'avvio della shell. |
SHLVL | Numero che identifica il livello della shell, questo aumenta ogni volta che viene richiamato un nuovo comando. |
TMOUT | Questo può essere impostato per uscire dalla shell dopo un tot di inattività. Utile per evitare accessi non autorizzati. |
Qualche chicca
Uscire dalla shell
Per uscire dalla shell: CTRL+D o exit, se si è in un terminale causerà la chiusura di quest'ultimo...Ok, la chicca non era questa, andiamo avanti.
Alias
Bash:
$ alias rm='rm -i'
È possibile rimuovere un alias tramite unalias.
NOTA: Questo vale solo per la shell corrente, è possibile inserire degli alias persistenti attraverso .bashrc.
Configurare la shell
Ci sono vari file di configurazione che definiscono il comportamento della shell. Alcuni sono eseguiti per ogni utente e per ogni shell, altri sono specifici di utenti che creano i loro file di configurazione.
Gli utenti possono modificare questi file direttamente dalla loro home, attraverso file come .bash_profile e .bashrc.
Un modo molto semplice per modificare questi file è usare l'editor nano:
Bash:
$ nano $HOME/.bashrc
È anche possibile farlo senza aprire una nuova shell:
Bash:
$ source $HOME/.bashrc
Il prompt
Il prompt consiste in una serie di caratteri che appaiono ogni volta che la shell è pronta ad accettare un comando. La variabile d'ambiente PS1 imposta ciò che il prompt contiene ed è quello con cui si interagisce la maggior parte delle volte. Se la shell richiede input aggiuntivi si utilizzano i valori PS2, PS3, PS4.
Solitamente il prompt, di default, ha già qualche informazione:
Bash:
[pinco@pallo ~]$
NOTA: ~ rappresenta $HOME in forma contratta. Quindi quella informazione dell'esempio sopra cambia ogni volta che si cambia directory, in sintesi: è la working directory.
Vari caratteri speciali permettono di includere varie informazioni nel prompt. Ecco una tabella:
Carattere | Descrizione |
---|---|
\! | Mostra il numero (nella cronologia) del comando corrente. |
\# | Simile a quello precedente, ma include solo i comandi della shell corrente. |
\$ | Mostra se si è utente ($) o root (#). |
\W | Mostra il nome di base della directory corrente. ES: /usr/share/themes apparirà solo come themes. |
\w | Mostra il percorso completo della directory corrente. |
\[ | Precede una sequenza di caratteri non stampabili, può essere usata per aggiungere colori, grassetto, etc. |
\] | Segue una sequenza di caratteri non stampabili. |
\\ | Mostra un backslash. |
\d | Mostra nome del giorno, mese, numero del giorno. ES: Ven Mag 14 |
\h | Mostra l'hostname del computer che sta eseguendo la shell. |
\n | Va a capo. |
\s | Mostra il nome della shell. ES: bash, zsh, dash. |
\t | Stampa l'ora corrente. ES: 23:39:21. |
\u | Stampa lo username. |
Per modificare permanentemente il valore PS1 basta recarsi in .bashrc nella vostra home e modificare il valore di PS1.
Aggiungere variabili d'ambiente a .bashrc
Esempio con PATH:
Supponiamo di voler aggiungere la /home/pallo/fattimiei al path. Aprite .bashrc e aggiungete la seguente riga:
Codice:
PATH=$PATH:/home/pallo/fattimiei ; export PATH
Potete creare variabili vostre.
Ottenere informazioni sui comandi
A primo impatto la shell sembra ostica, ma non è per nulla difficile!
Come faccio a sapere che comandi ho a disposizione, cosa possono fare, come usarli?
- Controllare il PATH. Scrivete echo $PATH. Avrete una lista di directory, supponiamo di voler ottenere una lista di comandi presenti nella directory /bin.
Bash:
$ ls /bin
- Usare help. Molti comandi sono nella shell stessa, quindi non appaiono in nessuna directory. Il comando help mostra questi comandi e le opzioni disponibili per essi (help | less per una lista). Per info su un comando in particolare: help comando.
- Opzione --help (o –h) con il comando. Molti comandi includono questa opzione.
Bash:
date --help | less
- Comando info. Altro strumento per informazioni sui comandi.
- Comando man. Per il manuale, usatelo questo, è sacro.
Numero sezione | Nome sezione | Descrizione |
---|---|---|
1 | Comandi utente | Comandi che possono essere eseguiti senza privilegi da qualsiasi utente. |
2 | System call | Funzioni usate per chiamate al kernel. |
3 | Funzioni di libreria di C | Funzioni che forniscono un'interfaccia per librerie di programmazione. |
4 | Dispositivi e file speciali | "Nodi" del filesystem che rappresentano dispositivi hardware (come CD) o software (come generatori casuali di numeri) |
5 | Formati e convenzioni | Tipi di file o file di configurazione specifici. |
6 | Giochi | Giochi disponibili. |
7 | Mista | Panoramica di argomenti come protocolli, filesystem, etc. |
8 | Strumenti di amministrazione e demoni | Comandi che richiedono privilegi particolari. |
Il comando man permette di cercare pagine del manuale o mostrarle, ecco qualche esempio:
Bash:
$ man –k passwd
…
passwd (1) - cambia la password utente
passwd (5) - il file delle password
$ man passwd
$ man 5 passwd
Usando –k si può cercare il nome e il sommario delle sezioni di tutte le pagine man installate sul sistema. Ce ne sono parecchie che includono "passwd" nel nome o nella descrizione.
NOTA: mandb lanciato da root inizializza il database.
Inoltre, man passwd mostrerebbe la prima sezione, se voglio un'altra sezione è bene specificarla, ad esempio man 5 passwd.
È possibile navigare nella pagina del manuale, ovviamente, basta usare Page Down, Page Up, Invio, freccia su e giù. Con / si può cercare un termine, con n si ripete la ricerca in avanti, con N all'indietro. Per uscire q.
Fine dell'introduzione
Bene, abbiamo finito per oggi.
La prossima volta cercherò di dare indicazioni per quanto riguarda il filesystem e indirizzerò all'utilizzo di comandi in maniera più specifica, spero questa introduzione possa esservi utile!