103.1 Lezione 2
Certificazione: |
LPIC-1 |
---|---|
Versione: |
5.0 |
Argomento: |
103 Comandi GNU e Unix |
Obiettivo: |
103.1 Lavorare con la Riga di Comando |
Lezione: |
2 di 2 |
Introduzione
Un ambiente di sistema operativo include gli strumenti di base, come la shell della riga di comando e talvolta una GUI, necessari per eseguire ciò di cui si ha bisogno. Il tuo ambiente inoltre ti fornirà tutta una serie di scorciatoie e valori predefiniti. In questa sezione impareremo come elencare, invocare e gestire quei valori.
Trovare le variabili di ambiente
Per iniziare, come possiamo identificare i valori attuali per ciascuna delle nostre variabili d’ambiente? Un modo è attraverso il comando env
:
$ env DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus XDG_RUNTIME_DIR=/run/user/1000 XAUTHORITY=/run/user/1000/gdm/Xauthority XDG_CONFIG_DIRS=/etc/xdg/xdg-ubuntu:/etc/xdg PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin GJS_DEBUG_TOPICS=JS ERROR;JS LOG [...]
Otterrai un gran numero di informazioni in output, molto più di quanto è incluso nell’estratto sopra. Ma per ora nota la voce PATH
, che contiene le directory in cui la tua shell (e altri programmi) cercheranno altri programmi senza necessariamente doverli richiamare indicandone il percorso completo. Con questo set, puoi eseguire un programma binario che risiede in /usr/local/bin
dalla tua home directory, come se il file fosse locale.
Cambiamo argomento per un attimo. Il comando echo
stamperà sullo schermo qualunque cosa tu gli dica. Che tu ci creda o no, ci saranno delle volte in cui usare echo
, per ripetere letteralmente qualcosa, sarà molto utile.
$ echo "Hi. How are you?" Hi. How are you?
Ma c’è qualcos’altro che puoi fare con echo
. Quando gli dai il nome di una variabile d’ambiente - e gli dici che questa è una variabile anteponendo al suo nome un carattere $
— ciò facendo, invece di stampare semplicemente il nome della variabile, la shell restituirà il suo valore. Non sei sicuro che la tua directory preferita sia attualmente nella variabile PATH? Puoi verificare rapidamente attraverso il comando echo
:
$ echo $PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
Creare Nuove Variabili d’Ambiente
Puoi aggiungere le tue variabili personalizzate al tuo ambiente. Il modo più semplice è usare il carattere =
. La stringa a sinistra sarà il nome della tua nuova variabile e la stringa a destra sarà il suo valore. Ora puoi fornire il nome della variabile a echo
per verificare se ha funzionato:
$ myvar=hello $ echo $myvar hello
Note
|
Da notare che non c’è spazio su entrambi i lati del segno uguale durante l’assegnazione variabile. |
Ma ha funzionato davvero? Digita "bash" nel terminale per aprire una nuova shell. Questa nuova shell assomiglia esattamente a quella in cui ti trovavi, ma in realtà è una figlia (child) di quella originale (che chiamiamo genitore). Ora, all’interno di questa nuova shell figlia, cerca di far sì che echo
realizzi la sua magia come prima. Niente. Cosa sta succedendo?
$ bash $ echo $myvar $
Una variabile che crei come abbiamo appena fatto sarà disponibile solo localmente - entro la sessione di shell stessa. Se avvii una nuova shell - o chiudi la sessione usando exit
- la variabile non ti seguirà. Digitando exit
qui tornerai alla shell genitore originale che, in questo momento, è dove vogliamo essere. Puoi eseguire echo $myvar
ancora una volta se vuoi solo confermare che la variabile è ancora valida. Ora digita export myvar
per passare la variabile a tutte le shell figlie che potresti successivamente creare. Provalo: digita bash
per una nuova shell e poi echo
seguito dalla variabile:
$ exit $ export myvar $ bash $ echo $myvar hello
Tutto ciò può sembrare un po' sciocco quando stiamo creando Shell senza uno scopo reale. Ma capire come vengono propagate le variabili della shell attraverso il tuo sistema diventerà molto importante una volta che si inizierà a scrivere script.
Cancellare una Variabile d’Ambiente
Vuoi sapere come eliminare tutte quelle variabili effimere che hai creato? Un modo è semplicemente quello di chiudere la shell genitore o riavviare il computer. Ma ci sono modi più semplici. Per esempio, "unset". Digitare unset
seguito dalla variabile (senza $
) per eliminarla. echo
ora lo dimostrerà.
$ unset myvar $ echo $myvar $
Se c’è un comando unset
, allora puoi scommettere che ci sia anche un comando set
. L’esecuzione di set
da sola mostrerà molte informazioni in output, ma in realtà non è poi così diverso da quello che ti ha restituito env
. Guarda la prima riga di output che otterrai quando filtri per la stringa PATH
:
$ set | grep PATH PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin [...]
Qual è la differenza tra set
ed env
? Per i nostri scopi, la cosa principale è che l’esecuzione di set
produrrà in output variabili e funzioni. Illustriamolo. Creeremo una nuova variabile chiamata mynewvar
e poi confermeremo che è lì:
$ mynewvar=goodbye $ echo $mynewvar goodbye
Ora, eseguendo env
insieme a grep
per filtrare la stringa mynewvar
non otterremo nessun risultato nell’output. Ma eseguire set
allo stesso modo ci mostrerà la nostra variabile locale precedentemente creata.
$ env | grep mynewvar $ set | grep mynewvar mynewvar=goodbye
Usare il Virgolettato per Escludere i Caratteri Speciali
Ora è un buon momento per farti affrontare il problema dei caratteri speciali. I caratteri alfanumerici (a-z e 0-9) vengono normalmente letti letteralmente da Bash. Se provi a creare un nuovo file chiamato myfile
, dovresti semplicemente digitare touch
seguito da myfile
e Bash saprà cosa farne. Ma se vuoi includere un carattere speciale nel tuo nome file, dovrai fare un po' più di lavoro.
Per illustrare questo, eseguiremo touch
seguito da: my big file
. Il problema è che ci sono due spazi tra le parole che Bash interpreterà. Mentre, tecnicamente, non chiameresti uno spazio un “carattere” , per Bash invece è come se lo fosse letteralmente. Se elenchi i contenuti della tua directory corrente, invece di un file chiamato my big file
, vedrai tre file denominati, rispettivamente, my
, big
e file
. Questo perché Bash ha ritenuto che tu volessi creare più file i cui nomi stavi passando in un elenco:
$ touch my big file $ ls my big file
Gli spazi verranno interpretati allo stesso modo se si eliminano (rm
) i tre file in un solo comando:
$ rm my big file
Ora proviamo nel modo giusto. Digita touch
e le tre parti del tuo nome file, ma questa volta racchiudi il nome tra virgolette. Questa volta ha funzionato. L’elenco dei contenuti della directory ti mostrerà un singolo file con il nome corretto.
$ touch "my big file" $ ls 'my big file'
Esistono altri modi per ottenere lo stesso effetto. Le virgolette singole, per esempio, funzionano così come le virgolette doppie. (Nota che le virgolette singole conserveranno il valore letterale di tutti i caratteri, mentre le virgolette doppie conserveranno tutti i caratteri ad eccezione di $
, `
,\
e, in alcuni casi, !
.)
$ rm 'my big file'
Anteporre un carattere di back slash (\
) a un caratterre speciale farà si che Bash lo interpreti letteralmente.
$ touch my\ big\ file
Esercizi Guidati
-
Usa il comando
export
per aggiungere una nuova directory al tuo path (questa modifica non sopravviverà al riavvio). -
Usa il comando
unset
per cancellare la variabilePATH
. Prova a eseguire un comando usandosudo
(per esempiosudo cat /etc/shadow
) . Cosa è successo? Perché? (L’uscita dalla shell ti riporterà al tuo stato originale.)
Esercizi Esplorativi
-
Ricerca in Internet l’elenco completo dei caratteri speciali.
-
Prova a eseguire comandi usando stringhe composte da caratteri speciali e usando vari metodi per evitarli. Ci sono differenze tra il modo in cui questi metodi si comportano?
Sommario
In questa lezione abbiamo imparato:
-
Come identificare le variabili d’ambiente del tuo sistema.
-
Come creare le proprie variabili di ambiente ed esportarle in altre shell figlie.
-
Come rimuovere le variabili d’ambiente e come usare sia i comandi
env
cheset
. -
Come gestire i caratteri speciali in modo che Bash li legga letteralmente.
In questa lezione sono stati discussi i seguenti comandi:
echo
-
Stampa in output stringhe e variabili.
env
-
Visualizza e modifica le variabili di ambiente.
export
-
Passa una variabile alle shell figlie.
unset
-
Rimuove i valori e gli attributi delle variabili e delle funzioni della shell.
Risposte agli Esercizi Guidati
-
Usa il comando
export
per aggiungere una nuova directory al tuo path (questa modifica non sopravviverà al riavvio).Puoi aggiungere temporaneamente una nuova directory (chiamata per esempio
myfiles
che risiede nella tua home directory) al tuo percorso usandoexport PATH="/home/youname/myfiles:$PATH"
. Crea un semplice script nella directorymyfiles /
, rendilo eseguibile e prova ad eseguirlo da una directory diversa. Questi comandi presumono che tu sia nella tua home directory che contiene una directory chiamatamyfiles
.$ touch myfiles/myscript.sh $ echo '#!/bin/bash' >> myfiles/myscript.sh $ echo 'echo Hello' >> myfiles/myscript.sh $ chmod +x myfiles/myscript.sh $ myscript.sh Hello
-
Usa il comando
unset
per cancellare la variabilePATH
. Prova a eseguire un comando usandosudo
(per esempiosudo cat /etc/shadow
) . Che cosa è successo? Perché? (L’uscita dalla shell ti riporterà al tuo stato originale.)Digitando
unset PATH
si cancelleranno le impostazioni della variabile path corrente. Tentare di invocare un binario senza il suo percorso assoluto fallirà. Per questa ragione, tentare di eseguire un comando usando sudo (che è esso stesso un programma binario situato in/usr/bin/sudo
) fallirà - a meno che non si specifichi la posizione assoluta, come in:/usr/bin/sudo /bin/cat /etc/shadow
. Puoi resettare la tuaPATH
usandoexport
o semplicemente uscendo dalla shell.
Risposte agli Esercizi Esplorativi
-
Ricerca in Internet l’elenco completo dei caratteri speciali.
Ecco la lista:
& ; | * ? " ' [ ] ( ) $ < > { } # / \ ! ~
. -
Prova a eseguire comandi usando stringhe composte da caratteri speciali e usando vari metodi per evitarli. Ci sono differenze tra il modo in cui questi metodi si comportano?
Utilizzando il carattere
"
si manterrano i valori speciali del simbolo del dollaro ($), dell’apice traversa () e del back slash. L’utilizzo del carattere ``
, annullerà invece tutti i significati speciali dei caratteri e consentirà una loro interpretazione letterale.$ echo "$mynewvar" goodbye $ echo '$mynewvar' $mynewvar