El shell és un terminal que et permet interactuar amb la màquina mitjançant ordres escrites.
Introducció
Els humans i els ordinadors solen interactuar de moltes maneres diferents, com ara mitjançant un teclat i un ratolí, interfícies de pantalla tàctil o mitjançant sistemes de reconeixement de veu. La forma més utilitzada per interactuar amb ordinadors personals s'anomena interfície gràfica d'usuari (GUI). Amb una GUI, donem instruccions fent clic amb el ratolí i utilitzant interaccions basades en menús.
Tot i que l'ajuda visual d'una GUI fa que l'aprenentatge sigui intuïtiu, aquesta manera de lliurar instruccions a un ordinador s'escala molt malament. Imagineu la tasca següent: per a una cerca bibliogràfica, heu de copiar la tercera línia de mil fitxers de text en mil directoris diferents i enganxar-la en un sol fitxer. Si utilitzeu una GUI, no només fareu clic al vostre escriptori durant diverses hores, sinó que també pots cometre un error en el procés de completar aquesta tasca repetitiva. Aquí és on aprofitem l'intèrpret d'ordres Unix.
L'intèrpret d'ordres Unix és alhora una interfície de línia d'ordres (CLI) i un llenguatge de script, que permet que aquestes tasques repetitives es facin automàticament i ràpidament. Amb les ordres adequades, l'intèrpret d'ordres pot repetir tasques amb o sense alguna modificació tantes vegades com vulguem. Utilitzant l'intèrpret d'ordres, la tasca de l'exemple de la literatura es pot realitzar en segons
Shell
Crea una màquina virtual amb Box tal com s'explica a Windows Subsytem for Linux (WSL):
> Connect-Wsl shell -New
Al finalitzar l'activitat borra la màquina amb:
> Remove-Wsl shell
El shell
és un programa on els usuaris poden escriure ordres. Amb l'intèrpret d'ordres, és possible invocar programes complicats com el programari de modelització del clima o ordres simples que creen un directori buit amb només una línia de codi. L'intèrpret d'ordres Unix més popular és Bash (el Bourne Again SHell, anomenat així perquè es deriva d'un shell escrit per Stephen Bourne).
L'ús d’un Shell requerirà un esforç i una mica de temps per aprendre. Tot i que una GUI us ofereix opcions per seleccionar, les opcions CLI no se us presenten automàticament, de manera que heu d'aprendre algunes ordres com ara vocabulari nou en un idioma que esteu estudiant. Tanmateix, a diferència d'una llengua parlada, un petit nombre de "paraules" (és a dir, ordres) us permetrà un llarg camí, i avui en parlarem d'aquestes poques.
La gramàtica d'un shell us permet combinar les eines existents en potents canalitzacions i gestionar grans volums de dades automàticament. Les seqüències d'ordres es poden escriure en un script, millorant la reproductibilitat dels fluxos de treball.
A més, la línia d'ordres és sovint la manera més senzilla d'interactuar amb màquines remotes i superordinadors. La familiaritat amb l'intèrpret d'ordres és gairebé essencial per executar una varietat d'eines i recursos especialitzats, inclosos sistemes informàtics d'alt rendiment. A mesura que els clústers i els sistemes de computació en núvol es fan més populars per a l'anàlisi de dades científiques, poder interactuar amb el shell s'està convertint en una habilitat necessària. Podem basar-nos en les habilitats de línia d'ordres que es tracten aquí per abordar una àmplia gamma de qüestions científiques i reptes computacionals.
Quan l'intèrpret d'ordres s'obre per primera vegada, et mostra un missatge que indica que l'intèrpret d'ordres està esperant l'entrada.
$
El shell normalment utilitza $
com a indicació, però pot utilitzar a símbol diferent. En els exemples d'aquesta lliçó, mostrarem la sol·licitud com $
.
Important. Només has d’escriure l'ordre que segueix la sol·licitud sense $
. Tingues en compte també que després d'escriure una ordre, has de prémer el botó Enter
per executar-lo.
L'indicador va seguit d'un cursor de text, un caràcter que indica la posició on apareixerà la teva escriptura. El cursor és generalment un bloc intermitent o sòlid, però també pot ser un guió baix o a canonada. És possible que l'hagueu vist en un programa d'editor de text, per exemple.
Tingueu en compte que la vostra sol·licitud pot semblar una mica diferent. En particular, els entorns d'intèrpret d'ordres més populars de manera predeterminada poseu el vostre nom d'usuari i el fitxer nom d'amfitrió abans de $
.
Aquesta indicació podria semblar, per exemple:
box@shell $
El missatge pot incloure més que això. No et preocupis si el teu prompte no és només un curt $
. Aquesta activitat no depèn sobre aquesta informació addicional i tampoc hauria d'interposar-vos en el vostre camí. L'únic element important en què centrar-se és el caràcter $
i més endavant veurem per què.
Així que provem la nostra primera comanda, ls
, que és l'abreviatura de list.
Aquesta ordre enumerarà el contingut del directori actual:
$ ls
Com que és una distribució servidor el directori de l’usuari box està buit.
Pots indicar de manera explícita el directori que vols que llisti:
$ ls /home/
box
Si l'intèrpret d'ordres no pot trobar un programa el nom del qual és l'ordre que has escrit, imprimirà un missatge d'error com ara:
$ ks
ks: command not found
Això pot passar si l'ordre s'ha escrit malament o si el programa corresponent a aquesta ordre no està instal·lada.
Navegació per fitxers i directoris
La part del sistema operatiu responsable de la gestió dels fitxers i directoris s'anomena sistema de fitxers. Organitza el nostre dades en fitxers, que contenen informació, i directoris (també anomenats 'carpetes'), que contenen fitxers o altres directoris.
Sovint s'utilitzen diverses ordres per crear, inspeccionar, canviar el nom i eliminar fitxers i directoris. Per començar a explorar-los, anirem al nostre obrir la finestra de la closca.
Primer, anem a esbrinar on som executant una ordre anomenada pwd
(que significa "imprimir el directori de treball" o "print working dir").
Els directoris són com llocs , en qualsevol moment mentre estem utilitzant el shell, estem exactament en un lloc anomenat el nostre corrent directori de treball . Les ordres llegeixen i escriuen principalment fitxers al fitxer directori de treball actual, és a dir, "aquí", per saber on ets abans executar una ordre és important.
pwd
et mostra on ets:
$ pwd
/home/box
Aquí, la resposta de l'ordinador és /home/box
, el qual és el directori d'inici de l’usuari box
.
Per entendre què és un "directori d'inici", fem una ullada a com el sistema de fitxers com un tot està organitzat. Pel bé d'aquest exemple, il·lustrarem el sistema de fitxers a l'ordinador de l’usuari box.
Després d'aquesta il·lustració, aprendràs ordres per explorar les vostres sistema de fitxers, que es construirà de manera similar, però no serà exactament idèntic.
A l'ordinador de box, el sistema de fitxers té aquest aspecte:
flowchart TD / --> bin / --> dev / --> home / --> tmp
El sistema de fitxers sembla un arbre al revés.
El directori més alt és el directori arrel que conté tota la resta. Per referir-te a ell fas servir directament el caràcter de barra inclinada, /
; aquest caràcter és la primera barra inclinada a /home/box
.
Dins d'aquest directori hi ha diversos altres directoris:
bin
(que és on s'emmagatzemen alguns programes integrats)dev
(dispositius units al sistema de fitxers local)home
(on els usuaris es troben els directoris personals)tmp
(per a fitxers temporals que no s'han d'emmagatzemar a llarg termini), etc.
Sabem que el nostre directori de treball actual /home/box
s'emmagatzema a l'interior de /home
perquè /home
és la primera part del seu nom. De la mateixa manera, saps que /home
s’emmagatzema dins del directori arrel /
perquè el seu nom comença amb /
.
Barra inclinada. Observa que hi ha dos significats pel caràcter /
.
- Quan apareix al capdavant d'un nom de fitxer o directori, es refereix a el directori arrel.
- Quan apareix dins d'un camí, només és un separador.
A sota /home
, trobem un directori per a cada usuari amb un compte a la màquina shell, em aquest cas només box.
flowchart TD / --> bin / --> dev / --> home / --> tmp home --> box
Els fitxers de l'usuari box emmagatzemen a /home/box
i els fitxers de l'usuari ubuntu emmagatzemen a /home/ubuntu. box és l’usuari dels nostres exemples; per tant, considerem /home/box
el nostre directori d'inici.
Normalment, quan obres un nou indicador d'ordres, estaràs al teu directori personal al començar.
ls
(list)
Tal com s’ha explicat abans en el directori de l'usuari box
no hi ha cap directori.
El primer que farem és baixar uns fitxers que ens serviran per treballar els diferents exemples:
$ cd
$ curl https://gitlab.com/xtec/security/-/raw/main/shell-data.tar.gz | tar -xz
Ara anem a conèixer l'ordre que ens permetrà veure el contingut del nostre propi sistema de fitxers.
Pots veure què hi ha al nostre directori d'inici executant ls
:
$ ls
shell-data
ls
imprimeix els noms dels fitxers i directoris al fitxer directori actual. Podem fer que la seva sortida sigui més comprensible mitjançant l'ús de l’opció -F
opció que indica a ls
que classifiqui la sortida afegint un marcador als noms de fitxers i directoris indicant que són:
- un barra inicial
/
indica que és un directori @
indica un enllaç*
indica un executable
Depenent de la configuració predeterminada de l'intèrpret d'ordres, també pots utilitzar colors per indicar si cada entrada és un fitxer o directori.
$ ls -F
shell-data/
Aquí, pots veure que el directori d'inici només conté subdirectoris. Qualsevol nom a la sortida que no ho faci tenen un símbol de classificació són fitxers en l'actual directori de treball.
Si la pantalla està massa desordenada, pots esborrar el teu terminal utilitzant la comanda clear
o Ctrl + D
.
Pots accedir a les ordres anteriors utilitzant les tecles ↑
i ↓
per moure's línia per línia, o per desplaçant-te pel teu terminal.
Ajuda
ls
té moltes altres opcions .
N'hi ha dues maneres habituals d'esbrinar com utilitzar una ordre i quines opcions accepta:
- Pots passar l’opció
--help
a qualsevol comanda, per exemple:ls --help
- Pots llegir el seu manual amb
man
(manual):man ls
També hi ha l'opció de Google i ChatGPT, però abans o després descobrirás que aquestes opcions que t'expliquem també són molt interessants, i estan escrites en Anglés ... 😳 (pel professor no és cap problema 🤨)
--help
La majoria de les ordres i programes bash que la gent ha escrit per executar-los des de dins de bash, donen suport a l’opció --help
que mostra més informació sobre com utilitzar l'ordre o el programa.
$ ls --help
Usage: ls [OPTION]... [FILE]...
List information about the FILEs (the current directory by default).
Sort entries alphabetically if none of -cftuvSUX nor --sort is specified.
Mandatory arguments to long options are mandatory for short options too.
-a, --all do not ignore entries starting with .
...
Si intentes utilitzar una opció que no és compatible, ls
i altres ordres solen imprimir un missatge d'error similar a:
$ ls -j
ls: invalid option -- 'j'
Try 'ls --help' for more information.
man (manual)
L'altra manera d'aprendre ls és escriure
$ man ls
Aquesta ordre convertirà el vostre terminal en una pàgina amb una descripció de l'ordre ls
i les seves opcions.
Per navegar per la pàgines man,
-
Pots utilitzar
↑
i↓
per moure's línia per línia -
Provar
B
i la barra d’espai per saltar amunt i avall una pàgina sencera. -
Per buscar per a un caràcter o paraula en el pàgines man, fes servir la tecla
/
seguit del caràcter o paraula que cerques. De vegades a la cerca donarà lloc a diverses visites. Si és així, us podeu moure entre les hits utilitzantN
(per avançar) iShift + N
(per anar enrere).
Per abandonar el les pàgines man, prem Q
.
Explorant altres directoris
No només pots utilitzar ls
al directori de treball actual, però el podem utilitzar per llistar el contingut d'un directori diferent.
Anem a fer una ullada al nostre directori shell-data
executant ls -F shell-data
, és a dir, l'ordre ls
amb l’opció -F
i l’argument shell-data
.
L'argument shell-data
diu a ls que volem una llista d'alguna cosa que no sigui el nostra directori de treball actual:
$ ls -F shell-data
exercise-data/ north-pacific-gyre/
Tingues en compte que si passes com argument un directori que no existeix al teu directori de treball actual, aquesta ordre retorna un error:
$ ls -F kkk
ls: cannot access 'kkk': No such file or directory
Organitzar les coses de manera jeràrquica ens ajuda a poder trobar les coses quan les busquem.
Si vols ho pots guardar tot directament al teu directori "home", en aquets cas /home/box
, Linux no té cap problema, li és completament indiferent.
Però potser t'interessa més a tu guardar alguns fitxers en carpetes separades (recorda que a Linux tan li fa) amb noms que expliquin que guarden, per exemple /home/box/travel/egypt
per guardar les fotografies tel teu viatge a egipte.
Ara que saps que el directori exercise-data
està situat al directori shell-data
, pots utilitzar la mateixa estratègia que abans.
Pots mirar-ne el contingut passant un nom de directori a ls
:
$ ls -F shell-data/exercise-data
alkanes/ animal-counts/ creatures/ numbers.txt writing/
Canviar de directori
Una altra opció es canviar la nostra ubicació a un directori diferent, de manera que ja no ens trobem al nostre directori d'inici.
L'ordre per canviar d'ubicació és cd
seguit del nom del directori per canviar el nostre directori de treball.
cd
vol dir "change dir", que és una mica enganyós perquè l'ordre no canvia el directori sinó que canvia el directori de treball actual del shell. En altres paraules, canvia la configuració de l'intèrpret d'ordres per a quin directori som.
L'ordre cd
és semblant a fer doble clic en una carpeta en una interfície gràfica per entrar a aquesta carpeta.
Per exemple pots entrar al directori exercise-data
:
box@shell:~$ pwd
box@shell:~$ cd shell-data
box@shell:~/shell-data$ cd exercise-data
box@shell:~/shell-data/exercise-data$
Notaràs que cd
no imprimeix res. Això és normal. Moltes ordres del shell no mostren res per pantalla encara que s'hagi executat correctament.
El que si notarás és que el prompt a canviat perquè et mostra on estás respecte el teu directori.
Si vols conèixer la ruta absoluta pots executar la comanda pwd
("path working directory"):
$ pwd
/home/box/shell-data/exercise-data
Si ara executes l'ordre ls -F
sense arguments, enumerarà els continguts de /home/box/shell-data
perquè és on estem ara:
$ ls -F
alkanes/ animal-counts/ creatures/ numbers.txt writing/
Ara sabem com baixar per l'arbre de directoris (és a dir, com entrar a un subdirectori), però com pugem (és a dir, com deixem un directori i anar al seu directori principal)?
Pots provar el següent:
$ cd shell-data
-bash: cd: shell-data: No such file or directory
Però tenim un error! Per què és això?
Amb els nostres mètodes fins ara, cd
només pot veure subdirectoris dins del vostre directori actual.
Hi ha diferents maneres de veure directoris per sobre de la vostra ubicació actual; començarem amb el més simple.
Hi ha una drecera a l'intèrpret d'ordres per pujar un nivell de directori.
Això funciona de la següent manera:
box@shell:~/shell-data/exercise-data$ cd ..
box@shell:~/shell-data$
..
és un nom de directori especial que significa "el directori que conté aquest”, o més concretament, el pare del directori actual.
Si executem pwd
després d’haver executat cd
pots veure que hem tornat a /home/box
:
$ pwd
/home/box/shell-data
El directori especial ..
no apareix quan executes ls
.
Si el vols mostrar, pots afegir l'opció -a
a ls -F
:
$ ls -F -a
./ ../ exercise-data/ north-pacific-gyre/
-a
significa "mostrar-ho tot" (inclosos els fitxers ocults); això força a ls
per mostrar-nos els noms de fitxers i directoris que comencen amb .
, tal com ..
(per exemple si som a /home/box
fa referència al directori /home
).
Com pots veure, també mostra un altre directori especial que s’anomena .
, que significa "el directori de treball actual". Pot semblar redundant tenir un nom pel directori actual, però aviat veurás alguns usos.
Tingues en compte que a la majoria de les eines de línia d'ordres hi poden haver diverses opcions que es poden combinar amb un sol -
sense espais entre les opcions; ls -F -a
és equivalent a ls -Fa
.
Aquestes tres ordres són les ordres bàsiques per navegar sistema de fitxers al teu ordinador: pwd
, ls
i cd
.
Què passa si escrius cd
pel seu compte, sense pasar un directori com argument?
box@shell:~/shell-data$ cd
box@shell:~$
Tal com t’indica el prompt i pots verificar amb la comanda pwd
has tornat al teu directori:
$ pwd
/home/box
Resulta que cd
sense argument et torna al teu directori d'inici, que és fantàstic si t’has perdut en el teu sistema de fitxers.
Intenta tornar al directori exercise-data
. La darrera vegada, vas utilitzar dos ordres, però en realitat podem encadenar conjuntament la llista de directoris per mouren's a exercise-data
en un sol pas:
box@shell:~$ cd shell-data/exercise-data
box@shell:~/shell-data/exercise-data$
Comprova que t'has mogut al lloc correcte executant pwd
i ls -F
:
$ pwd
/home/box/shell-data/exercise-data
$ ls -F
alkanes/ animal-counts/ creatures/ numbers.txt writing/
Si vols pujar un nivell des del directori de exercise-data
pots utilitzar cd ..
.
Però hi ha una altra manera de moure's a qualsevol directori, independentment de la teva ubicació actual.
Fins ara, en especificar noms de directoris, o fins i tot una ruta de directori (com anterior), has estat utilitzant camins relatius . Quan utilitzes un camí relatiu amb una ordre com ls
o cd
, l’ordre intenta trobar aquest lloc des d'on som enlloc de desde l’arrel del sistema de fitxers.
Tanmateix, és possible especificar el camí absolut a un directori incloent-hi el camí complet des del directori arrel, que s'indica amb una barra inclinada inicial. La barra inclinada /
diu l'ordinador per seguir el camí des de l'arrel del sistema de fitxers, per tant sempre es refereix a exactament un directori, sense importar on som quan estem executa l'ordre.
Això ens permet passar al nostre directori shell-data
des de qualsevol lloc del sistema de fitxers (inclòs des de dins exercise-data
).
Per trobar el camí absolut que estem buscant podem utilitzar pwd
i després extreure el troç que necessitem per moure's cap a shell-data
.
$ pwd
/home/box/shell-data/exercise-data
$ cd /home/box/shell-data
Executa pwd
i ls -F
per assegurar-te que som al directori que esperem.
Dues dreceres més
L'intèrpret interpreta el caràcter tilda (~
) al començament d'una ruta com "el directori inicial de l'usuari actual".
Per exemple, si el directori inicial de box és /home/box
, llavors ~/shell-data
és equivalent a /home/box/shell-data
.
Això només funciona si ~
és el primer caràcter de la ruta; kkk/~/xxx
no és equivalent a kkk/home/box/xxx
.
Una altra drecera és el caràcter -
(guionet).
cd -
es tradueix a l'anterior directori on estava, que és més ràpid que haver de recordar i després escriure, el camí complet.
Aquesta és una molt manera eficient de moure's d'anada i tornada entre dos directoris , és a dir, si executes cd -
dues vegades, acabeu de nou al directori inicial.
La diferència entre cd ..
i cd -
és que el primer et fa pujar , mentre que el segon et porta enrere.
Intenta-ho! Primer navega a ~/shell-data
(ja hauríes de ser-hi).
Ajuda. Per escriure el caràcter ~
es la combinació AltGr + 4
(a la vegada) i espai.
$ cd ~/shell-data
Ara fes un cd
al directori exercise-data/creatures
:
$ cd exercise-data/creatures
Ara si executes cd -
veuràs que has tornat a ~/shell-data
$ cd -
$ pwd
Executa cd -
de nou i tornes a ~/shell-data/exercise-data/creatures
.
Camins absoluts vs relatius
Començant des de /home/box/shell-data
quines de les següents ordres pots utilitzar per navegar al directori d'inici, que és /home/box
?
$ cd .
$ cd /
$ cd /home/box
$ cd ../..
$ cd ~
$ cd home
$ cd ~/shell-data/..
$ cd
$ cd ..
Prova cada opció (recorda que amb cd -
pots tornar on estaves abans):
$ cd /home/box
$ cd ~
$ cd ~/shell-data/..
$ cd
$ cd ..
Tabulador
Torna al directori home de l'usuari box i mostra els fitxers que estan a la carpeta shell-data/exercise-data/alkanes/
$ cd
$ ls shell-data/exercise-data/alkanes/
cubane.pdb ethane.pdb methane.pdb octane.pdb pentane.pdb propane.pdb
Això és molt a teclejar, però pot permetre que la terminal faci la major part del treball a través del que s'anomena autocompletat amb el tabulador. Si escrius
$ ls sh
i després prem el tabulador (la tecla de tabulador al teclat), la terminal completa automàticament el nom del directori per ella:
$ ls shell-data/
Si pressiones el tabulador de nou no fa res, ja que hi ha 2 possibilitats; pressionar el tabulador dues vegades mostra una llista de tots els fitxers, i així successivament. Això s'anomena autocompletat amb el tabulador, i ho veurem en moltes altres eines a mesura que avancem.
Treballant amb arxius i directoris
Ara sabem com explorar fitxers i directoris, però com els creem en primer lloc?
Torna al directori de l’usuari box i crea un nou directori anomenat thesis
usant l'ordre mkdir thesis
(que no genera una sortida):
$ cd
$ mkdir thesis
Com el seu nom suggereix, mkdir
significa "make directory”, que significa “crear directori” en anglès.
Atès que thesis
és una ruta relativa (és a dir, no inicia amb una barra obliqua /
), el nou directori es crea a la carpeta de treball actual:
$ ls -F
shell-data/ tesi/
Dues maneres de fer el mateix. Usar la terminal per crear un directori no és diferent de fer servir un navegador de fitxers gràfic. Si estas en un entorn d'escriptori, pots obrir el directori actual utilitzant el navegador de fitxers gràfic del vostre sistema operatiu, el directori thesis
apareixerà allà també. Si bé són dues maneres diferents d'interactuar amb els fitxers, els fitxers i els directoris amb què treballem són els mateixos.
Bona nomenclatura per a arxius i directoris. Usar noms complicats per a arxius i directoris poden fer la teva vida molt complicada quan es treballa a la línia d'ordres. T'oferim alguns consells útils per nomenar els teus fitxers d'ara endavant:
- No utilitzeu espais en blanc com fas amb el Windows.
Els espais en blanc poden fer un nom més significatiu, però, atès que s'utilitzen per separar arguments a la línia d'ordres, és millor evitar-los en noms de fitxers i directoris. Pots utilitzar -
o _
en comptes d'espais en blanc.
-
No comences el nom amb un
-
(guió). Les ordres tracten els noms que comencen amb-
com a opcions. -
Utilitza únicament lletres, números,
.
(punt),-
(guió) i_
(guió baix).Molts altres caràcters tenen un significat especial en la línia de comandes i els aprendrem durant aquesta lliçó. Alguns només faran que la teva comanda no funcioni, altres poden fins i tot fer que perdis dades.
Si et cal referir-te a noms de fitxers o directoris que tinguin espais en blanc o un altre caràcter no alfanumèric, cal posar el nom entre cometes dobles (""
).
Atès que acabem de crear el directori thesis
, encara es troba buit:
$ ls -F thesis
Canviem el nostre directori de treball a thesis
utilitzant cd
, i a continuació, executem un editor de text anomenat nano
per crear un fitxer am el nom draft.txt
:
$ cd thesis
$ nano draft.txt
Quin editor utilitzar?. Quan diem, “nano és un editor de text”, realment volem dir “text”: només funciona amb dades de caràcters simples, no amb taules, imatges o qualsevol altre format amigable amb l'usuari com el Word o el OpenOffice.
Als sistemes Unix (com Linux i Mac OS X) molts programadors utilitzen Emacs o Vim, però tots dos requereixen més temps per familiaritzar-se amb ells.
I el que es més important, tots el fitxers de configuració de Linux són en format text, si intentes editarlos amb Word o OpenOffice ...
Escrivim algunes línies de text. Quan estiguem contents amb el nostre text, podem pressionar Ctrl-O
(pressiona la tecla Ctrl
o Control, i mentrés la mantens pressionada, preme la tecla O
) per escriure les dades al disc (se'ns preguntarà a quin arxiu volem guardar això: pressiona Enter
per acceptar el valor predeterminat suggerit draft.txt
).
Quan el nostre arxiu està guardat, podem usar Ctrl-X
per sortir de l'editor i tornar a la terminal.
Tecla Control, Ctrl o ^
La tecla Control també s'anomena tecla “Ctrl”.
Hi ha diverses maneres dindicar l'ús de la tecla Control.
Per exemple, una instrucció per pressionar la tecla Control i, mentre la mantens premuda, pressionar la tecla X, pot ser descrita de qualsevol de les maneres següents:
- Control-X
- Control+X
- Ctrl-X
- Ctrl+X
- ^X
- C-x
En nano, al llarg de la part inferior de la pantalla es llegeix ^G Get Help ^O WriteOut
.
Això significa que pots fer servir Control-G
per obtenir ajuda i Control-
O per desar el vostre fitxer.
nano
no deixa cap sortida a la pantalla després que sortir del programa, però ls
ara mostra que hem creat un fitxer anomenat draft.txt
:
$ ls
draft.txt
Netegem una mica executant rm draft.txt
:
$ rm draft.txt
Aquesta ordre elimina fitxers (rm
és l'abreviatura de remove, remoure en anglès).
Si executes de nou ls
, la sortida estarà buida una vegada més, indicant-nos que el nostre arxiu ha desaparegut:
$ ls
Eliminar és per sempre
La terminal de Linux no té una paperera de reciclatge des d'on puguem restaurar fitxers eliminats (encara que la majoria de les interfícies gràfiques de Linux sí que en tenen).
En el seu lloc, quan eliminem fitxers, aquests es desvinculen del sistema de fitxers perquè el seu espai d'emmagatzematge en disc pugui ser reciclat.
Hi ha eines per trobar i recuperar arxius eliminats, com veurem a l'activitat Recuperació, però no hi ha garantia que funcionin en totes les situacions, ja que l'ordinador pot reciclar l'espai en disc de larxiu en qüestió immediatament, perdent de manera permanent.
Creem de nou el fitxer i després pugem un directori a /home/box
utilitzant cd ..
:
Si intentes eliminar tot el directori thesis
utilitzant rm thesis
, obtenim un missatge d'error:
$ rm thesis/
rm: cannot remove 'thesis/': Is a directory
Això passa perquè rm
normalment treballa només amb fitxers, no amb directoris.
Per realment desfer-nos de thesis
també hem d'eliminar l'arxiu draft.txt
.
Pots fer-ho amb l'opció recursiva per rm
:
$ rm -r thesis/
Eliminar els fitxers en un directori recursivament pot ser una operació molt perillosa. Si ens preocupa què podríem eliminar, podem afegir l'opció “interactiva” -i
a rm
, que ens demanarà confirmar cada pas.
$ rm -ri shell-data/
rm: descend into directory 'shell-data/'? y
rm: descend into directory 'shell-data/north-pacific-gyre'? y
rm: remove regular file 'shell-data/north-pacific-gyre/NENE01843A.txt'?
En qualsevol moment pots cancelar amb l'ordre ^C
.
Crearem el directori i el fitxer una vegada més. (Tingues en compte que aquesta vegada estem executant nano
amb la ruta d'accés thesis/draft.txt
, en lloc d'anar al directori thesis
i executar nano draft.txt
)
$ ls
$ mkdir thesis
$ nano thesis/draft.txt
$ ls thesis
draft.txt
no és un nom particularment informatiu, així que canviem el nom del fitxer usant l'ordre mv
, que és l'abreviatura de "move" (moure):
$ mv thesis/draft.txt thesis/quotes.txt
El primer paràmetre diu a mv
el que estem "movent", mentre que el segon indica on cal moure'l.
En aquest cas estem movent thesis/draft.txt
a thesis/quotes.txt
, que té el mateix efecte que canviar el nom del fitxer.
Com esperem, ls
ens mostra que thesis
ara conté un fitxer anomenat quotes.txt
:
$ ls thesis
quotes.txt
Cal anar amb compte en especificar el nom del fitxer destí, ja que mv
reemplaça silenciosament qualsevol fitxer existent amb el mateix nom, provocant pèrdua de dades.
Un flag addicional, mv -i
(o mv --interactiu
), es pot utilitzar per fer que mv
et demani confirmació abans de sobreescriure.
Només pel gust de la consistència, mv
també funciona en directoris, és a dir, no existeix una ordre separada mvdir
.
Mourem quotes.txt
al directori de treball actual. Utilitzem mv
una vegada més, però aquesta vegada només farem servir el nom d'un directori com el segon paràmetre per indicar a mv
que volem mantenir el nom de fitxer, però posar el fitxer en algun lloc nou (és per això que l'ordre s'anomena “moure”.)
En aquest cas, el nom de directori que fem servir és el nom de directori especial .
que hem esmentat abans:
$ mv thesis/quotes.txt .
El resultat és moure el fitxer des del directori on era al directori de treball actual.
ls
ara ens mostra que tesi està buit:
$ ls thesis
A més, ls
amb un nom de fitxer o un nom de directori com a paràmetre només llista aquest fitxer o directori.
Podem fer servir això per veure que quotes.txt
encara està al nostre directori actual:
$ ls quotes.txt
quotes.txt
L'ordre cp
funciona de manera semblant a mv
, excepte que copia un fitxer en lloc de moure'l.
Pots comprovar que va fer el correcte usant ls
amb dues rutes com a paràmetres — com la majoria de les ordres Linux, ls
pot rebre múltiples rutes alhora:
$ cp quotes.txt thesis/quotations.txt
$ ls quotes.txt thesis/quotations.txt
quotes.txt tesi/quotations.txt
Per provar que vam fer una còpia, eliminem el fitxer quotes.txt
del directori actual i després executem el mateix ls novament.
después ejecutemos el mismo ls de nuevo.
$ rm quotes.txt
$ ls quotes.txt thesis/quotations.txt
ls: cannot access quotes.txt: No such file or directory
thesis/quotations.txt
Aquest cop l'error ens diu que no es pot trobar quotes.txt
al directori actual, però troba la còpia a thesis
que no hem esborrat.
Què hi ha en un nom?
En aquesta part de la lliçó, fem servir sempre l'extensió .txt
.
Això és només una convenció: podem anomernar l'arxiu com mythesis
o gairebé qualsevol cosa que vulguem en Linux, no pas en Windows 😂 !!
No obstant això, la majoria de la gent fa servir noms de dues parts perquè sigui més fàcil (per a ells i els seus programes) diferenciar entre tipus de fitxers.
La segona part del nom thesis.txt
es diu la extensió de nom de fitxer i indica quin tipus de dades conté el fitxer: .txt
assenyala un fitxer de text sense format, .pdf
indica un document PDF, .cfg
és un fitxer de configuració ple de paràmetres per a algun programa, .png
és una imatge PNG, i així successivament.
Això és només una convenció, encara que una de important. Els fitxers contenen només bytes: depèn de nosaltres i dels nostres programes interpretar aquests bytes d'acord amb les regles per a fitxers de text, documents PDF, fitxers de configuració, imatges, etc.
Anomenar una imatge PNG d'una balena com balena.mp3
no ho converteix màgicament en un enregistrament del cant de les balenes, encara que podria fer que el sistema operatiu intenti obrir-lo amb un reproductor de música quan algú hi fa doble clic.
Pipes i filtres
Ara que ja sabem algunes ordres bàsiques, podem veure finalment la característica més poderosa de la terminal: la facilitat amb què ens permet combinar els programes existents de noves maneres.
Començarem amb un directori anomenat alkanes
que conté sis fitxers que descriuen algunes molècules orgàniques simples.
L'extensió .pdb
indica que aquests fitxers estan en format Protein Data Bank, un format de text simple que especifica el tipus i la posició de cada àtom a la molècula.
$ ls ~/shell-data/exercise-data/alkanes
cubane.pdb ethane.pdb methane.pdb octane.pdb pentane.pdb propane.pdb
$ nano ~/shell-data/exercise-data/alkanes/cubane.pdb
Entra a aquest directori usant l'ordre cd
i executa la comanda wc *.pdb
:
$ cd ~/shell-data/exercise-data/alkanes/
box@shell:~/shell-data/exercise-data/alkanes$ wc *.pdb
20 156 1158 cubane.pdb
12 84 622 ethane.pdb
9 57 422 methane.pdb
30 246 1828 octane.pdb
21 165 1226 pentane.pdb
15 111 825 propane.pdb
107 819 6081 total
wc
és l'ordre "word count" (recompte de paraules): compte el nombre de línies, paraules i caràcters d'un fitxer.
El *
a *.pdb
coincideix amb zero o més caràcters, per la qual cosa la terminal converteix *.pdb
en una llista de tots els fitxers .pdb
al directori actual.
Caràcters especials
*
és un caràcter especial o comodí. Correspon a zero o més caràcters, així que *.pdb
coincideix con ethane.pdb
, propane.pdb
, i cada fitxer que acaba amb .pdb
.
D'altra banda, p*.pdb
només coincideix amb pentane.pdb
i propane.pdb
, perquè la p
a l'inici fa coincidir els noms de fitxers que comencen amb la lletra p
.
?
també és un caràcter especial, però només coincideix amb un sol caràcter.
Això vol dir que p?.pdb
pot coincidir amb pi.pdb
o p5.pdb
(si existissin al directori molecules
), però no propane.pdb
.
Podem fer servir qualsevol nombre de caràcters especials alhora: per exemple, p*.p?*
coincideix amb qualsevol cosa que comenci amb una p
i acabi amb .
, p
i almenys un caràcter més (ja que ?
ha de coincidir amb un caràcter, i el final *
pot coincidir amb qualsevol nombre de caràcters).
Per tant, p*.p?*
coincidirà amb preferred.practice
o inclús p.pi
(atès que el primer *
pot no coincidir amb cap caràcter), però no quality.practice
(ja que no comença amb p
) o preferred.p
perquè no hi ha almenys un caràcter després de .p
.
Quan la terminal reconeix un caràcter especial l'expandeix per crear una llista de noms de fitxer coincidents abans d'executar l'ordre seleccionada.
Com a excepció, si una expressió amb caràcters especials no coincideix amb cap fitxer, la terminal passarà l'expressió com un paràmetre a l'ordre tal com està escrita.
Per exemple, executar ls *.pdf
al directori molecules
(que conté només els fitxers amb noms que acaben amb .pdb
) dóna com a resultat un missatge d'error indicant que no hi ha cap fitxer anomenat *.pdf
.
No obstant això, generalment comandes com wc
i ls
veuen les llistes de noms de fitxer que coincideixen amb aquestes expressions, però no els comodins per ells mateixos. És la terminal, no pas els altres programes, la que s'ocupa d'expandir els caràcters especials, aquest és un altre exemple de disseny ortogonal.
Activitat. Al directori alkanes
, quina variació de l'ordre ls
produirà aquesta sortida: ethane.pdb methane.pdb
?
$ ls *t*ane.pdb
$ ls *t?ne.*
$ ls *t??ne.pdb
$ ls ethane.*
Si executes wc -l
en lloc de wc
, la sortida només mostra el nombre de línies per fitxer:
$ wc -l *.pdb
20 cubane.pdb
12 ethane.pdb
9 methane.pdb
30 octane.pdb
21 pentane.pdb
15 propane.pdb
107 total
També podem fer servir wc -w
per obtenir només el nombre de paraules, o wc -c
per obtenir només el nombre de caràcters.
$ wc -w *.pdb
$ wc -c *.pdb
Redirect
Quin d'aquests fitxers és el més curt?
És una pregunta fàcil de respondre quan només hi ha sis fitxers, però i si n'hi hagués 6,000?
El nostre primer pas cap a una solució és executar la comanda:
$ wc -l *.pdb > lengths.txt
El símbol “més gran que” >
li diu a la terminal que redireccioneu la sortida de l'ordre a un fitxer en lloc d'imprimir-lo a la pantalla.
És per això que no hi ha sortida de pantalla: en comptes de mostrar-ho, tot allò que wc
imprimeix s'ha enviat al fitxer lengths.txt
.
Si no existeix el fitxer, la terminal el crearà. Si el fitxer existeix, serà sobreescrit silenciosament, cosa que pot provocar pèrdua de dades i, per tant, requereix certa precaució.
ls lengths.txt
confirma que el fitxer existeix:
$ ls lengths.txt
lengths.txt
Ara podem enviar el contingut de lenghts.txt
a la pantalla usant cat lengths.txt
.
cat
significa "concatenate" (concatenar): imprimeix el contingut dels fitxers un darrere l'altre.
En aquest cas només hi ha un fitxer, així que cat
només ens mostra el que conté:
$ cat lengths.txt
20 cubane.pdb
12 ethane.pdb
9 methane.pdb
30 octane.pdb
21 pentane.pdb
15 propane.pdb
107 total
Sortida Pàgina per pàgina. Seguirem utilitzant cat
en aquesta lliçó, per conveniència i consistència, però té el desavantatge que sempre bolca tot l'arxiu a la pantalla.
A la pràctica és més útil l'ordre less
, que s'utilitza com $ less lengths.txt
.
Aquesta ordre mostra només el contingut del fitxer que cap en una pantalla i després s'atura. Pots avançar a la següent pantalla prement la barra espaiadora, o retrocedir prement b
(back). Per sortir, prem q
(qit).
Ara utilitzarem l'ordre sort
per ordenar el contingut.
També farem servir l'indicador -n
per especificar que el tipus d'ordre que requerim és numèric en lloc d'alfabètic.
Això no canvia el fitxer; només desplega el resultat ordenat a la pantalla:
$ sort -n lengths.txt
9 methane.pdb
12 ethane.pdb
15 propane.pdb
20 cubane.pdb
21 pentane.pdb
30 octane.pdb
107 total
Podem posar la llista de línies ordenada en un altre fitxer temporal anomenat sorted-lengths.txt
posant > sorted-lengths.txt
després de l'ordre, així com fem servir > lengths.txt
per posar la sortida de wc
a lengths.txt
.
$ sort -n lengths.txt > sorted-lengths.txt
Quan has fet això, pots executar una altra ordre anomenada head
per obtenir les primeres línies de sorted-lengths.txt
:
$ head -n 1 sorted-lengths.txt
9 methane.pdb
El paràmetre -n 1
amb cap indica que només volem la primera línia del fitxer; -n 20
aconseguirà les primeres 20, i així successivament.
Atès que sorted-lengths.txt
conté les longituds dels nostres arxius ordenats de menor a major, la sortida de head
ha de ser el fitxer amb menys línies.
Pipe
Si creus que és confús, no estàs sol: fins i tot una vegada que entenguis el que fan wc
, sort
i head
, tots aquests fitxers intermedis fan difícil seguir el fil del que està passant.
Podem fer-ho més fàcil d'entendre executant sort
i head
junts:
$ sort -n lengths.txt | head -n 1
9 methane.pdb
La barra vertical |
entre les dues ordres es denomina "pipe" (pronunciat paip).
Una pipe li diu a la terminal que volem fer servir la sortida de l'ordre a l'esquerra com a entrada a l'ordre de la dreta.
L'ordinador pot crear un fitxer temporal si cal, copiar dades d'un programa a un altre a la memòria, o qualsevol altra cosa que sigui necessària; no cal que ho entenguem per fer-ho funcionar.
Res no ens impedeix encadenar pipes consecutivament.
Per exemple, pots enviar la sortida de wc
directament a sort
, i després la sortida resultant a head
.
Així, primer fas servir una pipe per enviar la sortida de wc
a sort
:
$ wc -l *.pdb | sort -n
9 methane.pdb
12 ethane.pdb
15 propane.pdb
20 cubane.pdb
21 pentane.pdb
30 octane.pdb
107 total
I ara enviem la sortida d'aquesta pipe, a través d'un altre pipe, a `head, perquè el pipeline complet es converteixi en:
$ wc -l *.pdb | sort -n | head -n 1
9 methane.pdb
Quan un ordinador executa un programa (qualsevol programa) crea un procés en memòria per emmagatzemar el programari del programa i el seu estat actual.
Cada procés té:
-
Un canal d'entrada anomenat entrada estàndard. (Per aquest punt, et pot sorprendre que el nom és tan memorable, però no et preocupis, la majoria de els programadors d'Unix en diuen "stdin").
-
Un canal de sortida predeterminat anomenat sortida estàndard (el "stdout”).
-
Un canal de sortida anomenat error estàndard (stderr) també existeix. Aquest canal sol utilitzar-se per a missatges derror o de diagnòstic i permet a l' usuari canalitzar la sortida dun programa a un altre mentre segueix rebent missatges derror al terminal.
La terminal és realment un altre programa.
Sota circumstàncies normals, el que ingressem al teclat s'envia a l'entrada estàndard de la terminal, i el que produeix a la sortida estàndard es mostra a la nostra pantalla. Quan diem a la terminal que executi un programa, aquesta crea un nou procés i envia temporalment el que teclegem al nostre teclat a l'entrada estàndard d'aquest procés, i el que el procés envia a la sortida estàndard, la terminal l'envia a la terminal pantalla.
Pipeline
Quan executem wc -l *.pdb > lengths.txt
:
- La terminal comença dient-li a l'ordinador que creï un nou procés per executar el programa
wc
- Com hem proporcionat alguns noms de fitxer com a paràmetres,
wc
els llegeix en comptes de l'entrada estàndard. - I ja que hem utilitzat
>
per redirigir la sortida a un fitxer, la terminal connecta la sortida estàndard del procés a aquest fitxer.
Si executem wc -l *.pdb | sort -n
:
- La terminal crea dos processos (un per a cada procés al pipe) de manera que
wc
isort
funcionen simultàniament. - La sortida estàndard de
wc
és alimentada directament a l'entrada estàndardsort
- Ja que no hi ha redirecció amb
>
, la sortida de ordenar va a la pantalla.
I si executem wc -l *.pdb | sort -n | head -n 1
, obtenim tres processos amb dades que flueixen dels arxius, a través de wc
a sort
, de sort
a head
i finalment a la pantalla.
Aquesta senzilla idea és la raó per la qual Unix ha tingut tant d'èxit.
En lloc de crear programes enormes que tracten de fer moltes coses diferents, els programadors de Unix se centren en crear moltes eines simples que fan bé la seva feina i són capaços de cooperar entre si.
Aquest model de programació es diu “pipes i filtres”. Ja hem vist pipes; i filtre és un programa com wc
o sort
que transforma una entrada en una sortida.
Gairebé totes les eines estàndard d'Unix poden funcionar d'aquesta manera: tret que se'ls indiqui el contrari, llegeixen d'entrada estàndard, fan alguna cosa amb el que han llegit, i escriuen a la sortida estàndard.
La clau és que qualsevol programa que llegeixi línies de text dentrada estàndard i escriviu línies de text a la sortida estàndard pot combinar-se amb qualsevol altre programa que es comporti daquesta manera també.
Pots i has escriure els teus programes d'aquesta manera perquè tu i altres persones puguin posar aquests programes a canonades i així multiplicar-ne el poder.
Activitats
Nelle Nemo
Nelle Nemo, una biòloga marina, acaba de tornar d'un estudi de sis mesos del Gir del Pacífic Nord, on ha estat mostrant la vida marina gelatinosa a la Gran Taca de fem del Pacífic.
Nelle ha processat les seves mostres a la seva màquina d'assaig, generant 17 fitxers al directori shell-data/north-pacific-gyre/
.
Com una revisió ràpida, a partir del seu directori d'inici, Nelle tecleja:
$ cd ~/shell-data/north-pacific-gyre/
$ wc -l *.txt
300 NENE01729A.txt
300 NENE01729B.txt
300 NENE01736A.txt
300 NENE01751A.txt
300 NENE01751B.txt
300 NENE01812A.txt
300 NENE01843A.txt
300 NENE01843B.txt
300 NENE01971Z.txt
300 NENE01978A.txt
300 NENE01978B.txt
240 NENE02018B.txt
300 NENE02040A.txt
300 NENE02040B.txt
300 NENE02040Z.txt
300 NENE02043A.txt
300 NENE02043B.txt
5040 en total
Si et fixes bé hi ha un fitxer que només de 240 linies.
Així és més fàcil de veure:
$ wc -l *.txt | sort -n | head -n 5
240 NENE02018B.txt
300 NENE01729A.txt
300 NENE01729B.txt
300 NENE01736A.txt
300 NENE01751A.txt
Quan Nelle torna i ho revisa veu que va fer aquell assaig a les 8:00 un dilluns al matí. Algú probablement va fer servir la mateixa màquina aquest cap de setmana, i va oblidar reiniciar-la.
Abans de tornar a analitzar aquesta mostra, decideix comprovar si alguns fitxers tenen massa dades:
$ wc -l *.txt | sort -n | tail -n 5
300 NENE02040B.txt
300 NENE02040Z.txt
300 NENE02043A.txt
300 NENE02043B.txt
5040 total
Aquestes xifres semblen bones, no hi ha cap fitxer amb més de 300 linies.
Però, què és aquesta Z
a l'antepenúltima línia?
Totes les mostres han d'estar marcades amb “A” o “B”; per convenció, el seu laboratori utilitza Z
per indicar mostres amb informació que falta.
Per trobar altres fitxers com aquest, Nelle fa el següent:
$ ls *Z.txt
NENE01971Z.txt NENE02040Z.txt
Com esperava, quan comprova el registre a l'ordinador portàtil, no hi ha profunditat registrada per a cap daquestes mostres.
Ja que és massa tard per obtenir la informació duna altra manera, ella ha d'excloure aquests dos arxius de la seva anàlisi.
Podria simplement esborrar-los usant rm
, però en realitat hi ha algunes anàlisis que podria fer més tard, on la profunditat no importa, de manera que, en comptes d'esborrar-los, només tindrà cura en seleccionar fitxers utilitzant l'expressió amb caràcters especials *[AB].txt
.
Com sempre, el *
coincideix amb qualsevol nombre de caràcters; l'expressió [AB]
coincideix amb una 'A' o una 'B', per la qual cosa coincideix amb els noms de tots els fitxers de dades vàlids que té.
$ ls *[AB].txt
Ordenar números
Crea un fitxer exemple.txt
amb la informació següent (amb nano
):
10
2
19
22
6
També pots crear el fitxer amb aquesta comanda:
$ echo $'10\n2\n19\n22\n6' > exemple.txt
Si executem sort
en aquest fitxer la sortida és:
$ sort exemple.txt
10
19
2
22
6
I el motiu és que s'ordenen alfabéticament com si fos un diccionari.
Per l'ordinador els caràcters que representen lletres, números o altres coses són el mateix!
Si vols dir-li a sort
que són números i que els ha d'ordenar com a números has d'utlitzar el flag -n
$ sort -n exemplet.txt
2
6
10
19
22
Redirecció
Si executes la comanda echo
el que escriguis sortirà per pantalla:
$ echo "Hola classe"
Hola classe
Si vols pots rediregir la sortida de la comanda a un fitxer enlloc de al terminal amb >
:
$ echo "Hola classe" > classe.txt
$ ls classe.txt
classe.txt
$ cat classe.txt
Hola classe
En moltes activitats crearem fitxers d’aquesta manera enlloc de fer servir nano
.
pipe
Al principi de l’activitat em baixats uns fitxers comprimits amb aquesta comanda:
$ curl https://gitlab.com/xtec/smx-6/-/raw/main/shell-data.tar.gz | tar -xz
Em fet servir una pipe |
per encadenar dues comandes.
Ara anem a fer-ho pas a pas.
Primer borra el directori shell data:
$ cd
$ rm -rf shell-data/
A continuació descarrega el fitxer shell.data.tar.gz
:
$ curl https://gitlab.com/xtec/smx-6/-/raw/main/shell-data.tar.gz -o shell-data.tar.gz
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 441k 100 441k 0 0 321k 0 0:00:01 0:00:01 --:--:-- 322k
box@user:~$ ls *gz
shell-data.tar.gz
Ara continuació hem de descomprimir el fitxer amb la comanda tar
tal com explicarem a Arxivar, i borrar el fitxer:
$ tar xfz shell-data.tar.gz
$ rm shell-data.tar.gz
$ ls -F
classe.txt shell-data/
Com hem fet en aquesta activitat molts cops farem servir pipes perquè és més ràpid com pots tornar a comprovar:
$ rm -rf shell-data/
$ curl https://gitlab.com/xtec/smx-6/-/raw/main/shell-data.tar.gz | tar -xz
$ ls -F
classe.txt shell-data/