This is an old revision of the document!


TP 1 - Linux

Objectifs

  1. Installation d'un environnement Linux
  2. Utilisation du système de commande sous Linux
  3. Installation de la programmation C pour Linux
  4. Demarer un program sur Python 3

Installer Ubuntu

Pour le laboratoire SdE, nous utiliserons Linux, la distribution Ubuntu.

Vous pouvez utiliser n’importe quelle distribution Linux de votre choix (Debian, Fedora, Mint, etc.), mais certaines commandes peuvent être un peu lointaines. différent. Les distributions similaires à Ubuntu sont:

  • Debian
  • Mint

Installer Ubuntu

Link catre prima parte din tema

Manuel

La forme de documentation la plus importante sous Linux, lorsque nous n’avons pas accès à Internet, sont les pages de manuel accessibles avec la commande man .

Par exemple, pour afficher des informations sur la commande 'echo' (commande qui affiche un message sur la sortie standard), nous allons utiliser la commande:

 student@sde: ~ $ man echo 

Les pages de manuel sont souvent volumineuses et nous devons les parcourir rapidement. Pour ce faire, après avoir ouvert la page de commande manuelle, nous pouvons utiliser les combinaisons de touches ci-dessous pour naviguer vers la page:

Touche Brève description
/string_to_search /(c'est-à-dire la touche barre oblique ) est utilisé pour rechercher string_to_search dans la page de manuel
n (next) pour aller à la prochaine occurrence du mot recherché avec/
N (Shift + n) aller à l'occurrence précédente du mot
q (quitter) fermer la page de manuel
Entrée faire défiler une ligne
f (en avant) ou Espace faire défiler un écran
b (en arrière) faire défiler un écran
d (en bas) faire défiler la moitié de l'écran
u (up) faire défiler la moitié de l'écran

Liste de commandes

Pour commencer, nous souhaitons intégrer les commandes de ligne de commande les plus importantes, en particulier celles qui fonctionnent avec des fichiers et des dossiers.

Nous avons également une liste de Commandes Linux que nous pouvons utiliser pour rappeler nos commandes les plus courantes.

Pour les exemples suivants, nous avons supposé ce qui suit:

  • le nom de l'utilisateur connecté est student
  • le répertoire personnel de l'utilisateur est /home/student
  • le nom de l'ordinateur est sde

Sur vos ordinateurs, ceux-ci seront différents, en fonction du nom d'utilisateur et de l'ordinateur.

Ouvrez un terminal. Clonez le contenu du dépôt SdE officiel à l'aide de la commande ci-dessous:

student@sde: ~ $ git clone https://github.com/UPB-FILS-SdE2/sde.git

Nous prévoyons de travailler avec ces commandes qui nous aident à naviguer dans les répertoires du système de fichiers (c’est-à-dire à le traverser). Ensuite, utilisez les commandes pour répertorier le contenu d'un répertoire et afficher le contenu d'un fichier.

La distinction entre un chemin absolu (chemin d’un répertoire à partir du répertoire racine, exemple: /home/student ) et un chemin relatif vers le répertoire actuel (à l’aide d’entrées spéciales .) et . - répertoire parent).

Regardez attentivement la séquence de commandes ci-dessous. Si vous voulez donner vos ordres sur la station sur laquelle vous travaillez, utilisez la touche TAB aussi souvent que vous donnez un paramètre à ls ou cd .

student@sde ~$ cd sde/tp01
 
student@sde sde$ pwd
/home/student/sde/tp01
 
student@sde sde$ tree .
 
.
├── music
│   ├── blake-shelton
│   │   └── friends
│   ├── carrie-underwood
│   │   ├── church-bells
│   │   ├── dirty-laundry
│   │   └── home-sweet-home
│   ├── miranda-lambert
│   │   ├── dumb-blonde
│   │   ├── vice
│   │   └── we-should-be-friends
│   └── thomas-rhett
│       └── craving-you
├── simple-python
│   ├── simple_hello.py
└── tv-shows
    ├── brooklyn99
    │   ├── amy
    │   ├── gina
    │   ├── jake
    │   ├── rosa
    │   └── terry
    └── young-sheldon
        ├── connie
        ├── george
        ├── georgie
        ├── marry
        ├── missy
        └── shelly
 
9 directories, 27 files

Maintenant, je vois la structure de répertoire, nous allons les parcourir:

student@sde sde$ cd music  #  ici j'ai utilisé un chemin par rapport au répertoire courant
student@sde music$ ls
blake-shelton		carrie-underwood	miranda-lambert		thomas-rhett
student@sde music$ cd .. # Je naviguais au directeur de la musique de répertoire parent /home/student/sde/tp01/sde
student@sde sde$ ls -R    
music		simple-gcc	tv-shows
 
./music:
blake-shelton		carrie-underwood	miranda-lambert		thomas-rhett
 
./music/blake-shelton:
friends
 
./music/carrie-underwood:
church-bells	dirty-laundry	home-sweet-home
 
./music/miranda-lambert:
dumb-blonde		vice			we-should-be-friends
 
./music/thomas-rhett:
craving-you
 
./simple-gcc:
Makefile	hello.c		simple_hello.c	utils.h
errors.c	help.c		utils.c		warnings.c
 
./tv-shows:
brooklyn99	young-sheldon
 
./tv-shows/brooklyn99:
amy	gina	jake	rosa	terry
 
./tv-shows/young-sheldon:
connie	george	georgie	marry	missy	shelly
 
student@sde sde$ cd /home/student/sde/tp01/tv-shows/brooklyn99 # # nous avons utilisé et TP01 cd/brookly99, mais j'ai utilisé chemin absolu
student@sde brooklyn99$ ls
amy	gina	jake	rosa	terry

Ls son argumentation afin que nous puissions donner un chemin relatif à un répertoire ou un fichier, et un chemin absolu:

student@sde brooklyn99$ ls ../young-sheldon   
connie	george	georgie	marry	missy	shelly
 
student@sde brooklyn99$ ls -l ../young-sheldon/connie
-rw-r--r--  1 student  staff  0 Jan 28 01:06 connie
 
student@sde brooklyn99$ ls -l ./amy
-rw-r--r--  1 student  staff  0 Jan 28 01:05 amy
 
student@sde brooklyn99$ ls -l amy
-rw-r--r--  1 student  staff  0 Jan 28 01:05 amy
 
student@sde brooklyn99$ ls -l /home/student/sde/tp01/tv-shows/brooklyn99/jake
-rw-r--r--  1 student  staff  0 Jan 28 01:05 jake

Une grande attention aux chemins relatifs par rapport aux l'absolu. Un chemin relatif est un chemin relatif au répertoire courant, tandis qu'un chemin absolu est relatif au répertoire racine ( «/»). Un chemin relatif commence généralement avec un nom avec « » Ou « .. », alors qu'un chemin absolu commence toujours par «/». Notez que et « ~/OSU » est aussi un chemin absolu, même si elle commence par le caractère « ~ », c'est parce que « ~ » est juste un alias pour le répertoire « home » « l'utilisateur actuel ( '/ home/student' « ).

Comme nous l'avons vu ci-dessus utilisent des exemples les chemins relatifs sont: <Type de note> Notez l'utilisation de la clé 'TAB' . </note>

student@sde music$ ls miranda-lambert        # ls m<TAB>
student@sde sde$ cd ./miranda-lambert           # cd ./m<TAB>
student@sde miranda_lambert$ ls ../thomas-rhett    # ls ../t<TAB>
student@sde miranda_lambert$ ls ../../tp01/music  # ls ../../t<TAB>/m<TAB>

Quelques exemples d'utilisation des chemins absolus:

student@sde sde$ ls /
student@sde sde$ tree /home/student/sde/tp01/music/miranda-lambert   # ls /h<TAB>/stu<TAB>/sde/tp01/m<TAB>/m<TAB>
student@sde sde$ ls -l ~/sde/tp01/music/miranda-lambert              # ls ~/sde/tp01/m<TAB>/m<TAB>
student@sde sde$ tree -L 1 ~

Voyons maintenant quelques erreurs qui peuvent survenir. Que pensez-vous qui se passe ci-dessous? Quelle est la cause de l'erreur, quelle erreur a été commise?

student@sde miranda-lambert$ ls -l lyrics
ls: cannot access lyrics: No such file or directory
 
student@sde miranda-lambert$ cd ..
student@sde tp01$ cd kenny-chesney
-bash: cd: kenny-chesney: Not a directory
 
student@sde sde$ cd /home/student/sde/tp01/music/taylor-swift
-bash: cd: /home/student/sde/tp01/music/taylor-swift: No such file or directory

Lisez attentivement les messages d'erreur Bash chaque fois qu'une commande ne fonctionne pas. Il fournit suffisamment d'indices sur la racine de l'erreur.

En général, tout cd devrait être suivi d'un ls ou d'un pwd à des fins de vérification. Comme nous l'avons vu ci-dessus, des erreurs peuvent parfois se produire, que le répertoire n'existe pas ou que nous ne soyons pas autorisés à y accéder et que la commande puisse être exécutée sans succès. Il est donc très important que tout ordre de modifier/modifier le statut courant à suivre d'une vérification. Voici quelques exemples de commandes qui forment une bonne paire: cd - pwd ; touch , mv , rm - ls ; écho - chat etc.

Utilisez la touche TAB chaque fois que vous le pouvez. Il suffit souvent de ne taper que les 2 ou 3 premières lettres du nom du dossier ou du fichier auquel nous voulons accéder. Si plusieurs répertoires/fichiers ont le même préfixe, nous pouvons ajouter d'autres lettres pour supprimer l'ambiguïté ou la touche “TAB” deux fois pour afficher la liste des occurrences contenant le même préfixe. Nous pouvons ensuite parcourir la liste des correspondances à l’aide de la touche “TAB”.

2. Arbre

L'un des utilitaires de base est “tree”, qui permet de répertorier le contenu des dossiers dans un format d'arborescence, ce qui facilite le suivi et la compréhension de l'organisation du système de fichiers. Dans la plupart des cas, une simple commande ls suffit, mais si vous voulez voir des niveaux inférieurs dans la hiérarchie des fichiers et des dossiers, 'tree' peut être très utile.

Utilisé sans arguments, tree listera tous les fichiers et répertoires sous sub le répertoire courant (. ).

student@sde/tp01$ tree
.
├── music
│   ├── blake-shelton
│   │   └── friends
│   ├── carrie-underwood
│   │   ├── church-bells
│   │   ├── dirty-laundry
│   │   └── home-sweet-home
│   ├── miranda-lambert
│   │   ├── dumb-blonde
│   │   ├── vice
│   │   └── we-should-be-friends
│   └── thomas-rhett
│       └── craving-you
├── simple-python
│   ├── simple_hello.py
└── tv-shows
    ├── brooklyn99
    │   ├── amy
    │   ├── gina
    │   ├── jake
    │   ├── rosa
    │   └── terry
    └── young-sheldon
        ├── connie
        ├── george
        ├── georgie
        ├── marry
        ├── missy
        └── shelly
 
9 directories, 27 files

tree peut recevoir un ou plusieurs répertoires en argument et les lister indépendamment pour chacun.

student@sde/tp01$ tree music tv-shows
music
├── blake-shelton
│   └── friends
├── carrie-underwood
│   ├── church-bells
│   ├── dirty-laundry
│   └── home-sweet-home
├── miranda-lambert
│   ├── dumb-blonde
│   ├── vice
│   └── we-should-be-friends
└── thomas-rhett
    └── craving-you
tv-shows
├── brooklyn99
│   ├── amy
│   ├── gina
│   ├── jake
│   ├── rosa
│   └── terry
└── young-sheldon
    ├── connie
    ├── george
    ├── georgie
    ├── marry
    ├── missy
    └── shelly
 
6 directories, 19 files

Si nous voulons afficher un répertoire contenant de nombreux fichiers et sous-répertoires, nous pouvons limiter le niveau de liste en utilisant l'argument -L .

student@uso tp01$ tree -L 1
.
├── music
├── simple-python
└── tv-shows
 
3 directories, 0 files

Notez que l'arborescence peut ne recevoir aucun argument, ou si elle le reçoit, il doit nécessairement s'agir d'un répertoire, sinon une erreur sera affichée.

student@sde brooklyn99$ tree amy
amy [error opening dir]
 
0 directories, 0 files

3. Pages du manuel

Sous Linux, la documentation la plus utilisée est probablement les pages de manuel. Voyons quelles sont les commandes que nous utilisons pour documenter notre Linux et comment nous trouvons des informations utiles.

Rechercher une commande:

student@sde ~$ apropos "remove files"
git-rm (1)           - Remove files from the working tree and from the index
rm (1)               - remove files or directories
 
student@sde ~$ apropos "copy files"
cp (1)               - copy files and directories
cpio (1)             - copy files to and from archives
docker-container-cp (1) - Copy files/folders between a container and the loca...
docker-cp (1)        - Copy files/folders between a container and the local f...
git-checkout-index (1) - Copy files from the index to the working tree
install (1)          - copy files and set attributes

Localiser une commande:

student@sde ~$ which ls
/bin/ls

Emplacement binaire, la source, mais aussi les fichiers où la page de manuel est utilisée:

student@sde ~$ whereis ls
ls: /usr/bin/ls /usr/share/man/man1/ls.1.gz

4. Opérations sur les fichiers et les dossiers

Maintenant que nous savons naviguer dans le système de fichiers, nous voulons créer des fichiers et des dossiers. Voyons avec quelles commandes nous pouvons créer, copier, déplacer et supprimer des fichiers et des dossiers.

Créer un fichier

Un nouveau fichier est généralement créé à l'aide d'un éditeur de texte tel que nano , vim ou de tout éditeur graphique. Vous pouvez également créer un fichier vide à l’aide de la commande touch .

student@sde ~$ touch filename  
student@sde ~$ ls -l
...
-rw-r--r-- 1 alexandru staff 0 ian 28 12:02 filename
...

Créer un répertoire

La création d'une direction s'effectue à l'aide de la commande mkdir .

student@sde ~$ mkdir dirname   # facem un director nou
student@sde ~$ ls -l  # verificam daca fisierul exista
...
drwxr-xr-x  2 alexandru alexandru      4096 ian 28 12:04  dirname
...

Copier

Vous copiez le fichier à l’aide de la commande cp .

student@sde miranda-lambert$ cp vice another-vice  # vice comme  another-vice

La copie d'un répertoire s'effectue également à l'aide de la commande cp , mais à l'aide de l'argument - r , - récursif ou - R

student@sde music$ cp -R miranda-lambert country-singer   # nous copions le réalisateur de miranda-lambert sous le nom chanteur country

Déplacer et renommer

Le déplacement ou le changement de nom (à la fin est plus ou moins identique) est effectué à l'aide de la commande mv .

student@sde tp01$ mv music country-music   # renommer le directeur musical en country-music
student@sde tp01$ mv country-music ../../   # déplace le répertoire country-music deux répertoires ci-dessus

Supprimer un fichier

La suppression d'un fichier s'effectue à l'aide de la commande rm .

student@sde miranda-lambert$ rm dumb-blonde # supprimer le fichier dumb-blonde

Supprimer un répertoire

Supprimez un répertoire avec la commande rmdir . Attention, seuls les répertoires vides peuvent être supprimés.

student@sde music $ rmdir blake-shelton # supprime le répertoire blake-shelton

La suppression d'un répertoire non vide s'effectue à l'aide de la commande rm en utilisant l'un des arguments - r , - R ou - récursif .

student@sde music $ rm -r blake-shelton # renommer le répertoire de musique en country-music

Exercices

Lorsque vous travaillez sur des exercices, faites attention au répertoire dans lequel vous vous trouvez lorsque vous lisez les conditions, mais également lorsque vous les résolvez. Le plus sûr est d'utiliser la commande

 student@sde: ~ $ pwd 

La signification est 'print working directory' '

1. Utilisez Git

Vérifiez que vous vous trouvez dans le répertoire de base de votre utilisateur (par exemple, l'utilisateur était un “student”, c'est-à-dire le répertoire ”/ home/student”). Recherchez l’invite (contenant le caractère pour le répertoire de base) ou utilisez la commande pwd :

student@sde:~$ pwd
/home/student

Maintenant que vous savez que vous vous trouvez dans le répertoire de base de votre utilisateur, clonez le contenu official SdE

Notez qu'un répertoire nommé 'sde' a été créé dans le répertoire de base. Le message git clone nous en parle (voir la première ligne du résultat):

Cloning into 'sde'...
remote: Counting objects: 54, done.
remote: Compressing objects: 100% (12/12), done.
remote: Total 54 (delta 2), reused 0 (delta 0)
Unpacking objects: 100% (54/54), done.

Le répertoire 'sde' a été créé relatif (en utilisant un chemin relatif) par rapport au répertoire actuel (qui dans notre cas était /home/student , il est légèrement différent pour vous, car le nom d'utilisateur est différent).

Suite à la commande ci-dessus, le répertoire 'sde' est apparu dans le répertoire de base de votre utilisateur.

student@sde:~$ ls
... sde ...

Utilisez la commande cd et changez le répertoire en sous-répertoire sde/tp01 . Dans le sous-répertoire sde/tp01 , vous trouverez la structure de répertoires et les fichiers nécessaires à la résolution du laboratoire.

2. Structure du système de fichiers

Renommez le répertoire cloné /home/student/sde en ligne de commande '/ home/student/sde-repository' '.

Les exercices suivants supposent qu'il existe un répertoire appelé sde-repository dans le répertoire /home/student . Assurez-vous que vous êtes dans le bon répertoire, faites attention aux chemins relatifs et absolus. Lorsque la demande indique vous êtes dans le répertoire X , utilisez la commande cd X pour entrer dans ce répertoire. X sera généralement un chemin absolu

  • Vous êtes dans le répertoire /home/student .
  • Allez dans le dossier sde-repository/tp01 , cloné pour l'exercice précédent.
  • Nous voulons voir tous les fichiers et sous-répertoires du répertoire actuel. Pour cela, nous avons deux options:
    1. Utilisation de l'argument de commande ls :
       student@sde: ~/tp01 $ ls -R 
    2. La sortie de la commande ls -R n'est pas très facile à suivre pour les répertoires contenant beaucoup d'entrées. Pour voir la structure arborescente plus conviviale, nous pouvons utiliser arbre .

Il est possible que l’arbre n’existe pas dans le système. Le résultat de la commande sera alors:

student@sde:~/sde-repository $ tree
bash: tree: command not found...

Dans ce cas, nous devons l’installer:

student@sde:~$ sudo apt-get install tree

3. Supprimer des fichiers

Vous êtes dans le répertoire /home/student/sde-repository .

Supprimez le fichier simple_hello.py du répertoire 'tp01/simple_python/'.

Notez que j'ai utilisé un chemin relatif vers le répertoire /home/student . Nous aurions pu l'utiliser

Regardez dans la page de manuel de rm ('man rm' ') après' récursif '.

Entrez le répertoire tp01/empty_dir . Essayez de supprimer le répertoire empty_dir . Utilisez la commande

rmdir empty_dir

Pourquoi ne pouvons-nous pas supprimer “empty_dir” par cette méthode? Allez dans le dossier empty_dir et vérifiez s'il contient des fichiers (il peut contenir des fichiers cachés!). Supprimez-en les fichiers, revenez dans le répertoire parent et vérifiez si la commande rmdir empty_dir fonctionnes.

4. Créer des fichiers avec des noms compliqués

Entrez le répertoire sde-repository/tp01/filesys

Utilisez la commande suivante:

mkdir Program Files and Accessories 

Répertorie le contenu du répertoire 'filesys'. Combien de répertoires qu'il contient. Pourquoi Était-ce l'effet désiré? Afin de créer un répertoire avec des espaces dans son nom, nous avons deux alternatives:

student@uso:$ mkdir "Program Files and Accessories"
student@uso:$ mkdir Program\ Files\ and\ Accessories

Ne tapez plus la commande, utilisez la touche SAGEATA_SUS pour revenir à la commande précédente, tapez ", Ctrl+A pour aller au début de la ligne, Alt+F pour avancer un mot et enfin taper à nouveau.

Assurez-vous que cette fois le répertoire créé porte le nom souhaité en utilisant la commande ls .

Sans entrer dans le répertoire créé, "Program Files and Accessories", créez 3 fichiers portant le nom "Open Office", "Mozilla Firefox" și "Incredible long file name that contains a lot of spaces" et deux repertoires "App Data" și "Local Settings" în "Program Files and Accessories". Essayez également d'utiliser le bouton TAB autant que possible.

Copiez les deux premiers fichiers créés précédemment dans le répertoire simple_python/ .

Ecrivez un texte aléatoire dans "Nom de fichier long et incroyable contenant de nombreux espaces" à l'aide de la commande “echo” ou “vim”.

student@sde:$ echo "un text" > Inc<TAB>   # vous utilisez la touche TAB, vous ne tapez pas tout le nom du fichier

Renommez le fichier '' Nom de fichier long incroyable contenant beaucoup d'espaces "” dans '' Nom de fichier long incroyable contenant moins d'espaces "”. Appuyez sur la touche TAB . Essayez d'utiliser le moins de clés possible.

Une solution rapide peut être la suivante. “Alt +.” Est un moyen d'itérer avec les derniers paramètres des commandes plus tôt). Nous tapons ensuite 'Alt + b' pour revenir en arrière puis, en utilisant Alt + Backspace, nous supprimons les 3 mots dont nous n’avons plus besoin. Enfin, le texte "moins \" est uniquement ajouté.

Copiez l'intégralité du répertoire 'filesys' dans /home/student . Pourquoi la commande ci-dessous ne fonctionne-t-elle pas?

student@sde:$ pwd
/home/student/sde-repository/tp01/filesys
student@uso:$ cp . /home/student

Nous avons besoin de récursif (comme rm ). Regardez dans la page de manuel de cp ('man cp' ') après' récursif '.

Entrez le dossier parent de filesys . Déplacez to_move vers /tmp . Notez que pour mv , nous n'avons pas besoin du paramètre -r (pour la récursivité).

Vérifiez que votre commande est exécutée avec succès à l’aide d’une commande ls .

5. Prelucrarea informației dintr-un fișier

Pentru a afișa pe ecran conținutul unui fișier folosim utlitarul cat. Rulăm comanda de mai jos, pentru a exemplifica:

student@sde:~$ cat sde-workspace/tp01/tv-shows/young-sheldon/shelly
My name is Sheldon
and I love science.

Folosim comanda cat în combinație cu alte comenzi pentru a extrage sau filtra conținutul anumitor fișiere. Comanda cat primește ca argumente calea către unul sau mai multe fișiere și afișează pe ecran conținutul concatenat al acestora.

Un exemplu uzual este faptul că vrem să extragem informațiile despre starea memoriei sistemului din fișierul /proc/meminfo. Pentru aceasta rulăm comanda de mai jos:

student@sde:~$ cat /proc/meminfo | grep "Mem"
MemTotal:        2041248 kB
MemFree:          236092 kB
MemAvailable:     874420 kB

În exemplul de mai sus folosim cat pentru a oferi ca intrare conținutul fișierului /proc/meminfo utilitarului grep; cu utilitarul grep filtrăm conținutul după textul "Mem". Cu alte cuvinte, outputul comenzii cat /proc/meminfo, adică conținutul fișierului /proc/meminfo este textul pe care utilitarul grep îl prelucrează.

Folosind simbolul pipe (|) putem inlantui comenzi astfel incat outputul comenzii precedente devine input pentru comanda urmatoare.

Exercițiu: Plecând de la exemplul de mai sus, extrageți din fișierul /proc/cpuinfo dimensiunea memoriei cache a procesorului vostru; filtrați conținutul după textul "cache".

Afișarea parțială a unui fișier

Am văzut că utilitarul cat afișează întreg conținutul unui fișier. Există scenarii în care suntem interesați doar de începutul sau sfârșitul unui conținut. Pentru aceste cazuri putem folosi utilitarele:

  • head - afișează primele 10 linii din conținut
  • tail - afișează ultimele 10 linii din conținut

Valoarea 10 este valoarea implicită a ambelor utilitare, dar putem specifica un alt număr de linii.

Exemplu:

student@sde:~$ cat sde-workspace/tp01/tv-shows/young-sheldon/shelly | head -1
My name is Sheldon

Exercițiu: Afisati primii 10 utilizatori din sistem (lista utilizatorilor se gaseste in directorul /etc/passwd).

Căutarea în fișiere

Așa cum am văzut până în acest punct din carte, majoritatea comenzilor Linux afișează o gamă largă de informații pe care apoi utilizatorul (adică noi) le filtrează pentru a extrage ceea ce îl intresează. La începutul acestei secțiuni, am folosit utilitarul grep ca să filtrăm rezultatul unei comenzi.

Comanda grep este una dintre cele mai folosite în linie de comandă. Sintaxa de folosire a grep este următoarea:

SYNOPSIS
       grep [OPTIONS] PATTERN [FILE...]

grep caută PATTERN în lista de fișiere primită ca argument și afișează liniile care conțin PATTERN-ul căutat. Atunci când nu primește nici un fișier, citește text de la tastatură (intrarea standard) și afișează liniile care conțin PATTERN-ul căutat.

Până acum noi am utilizat grep după modelul de mai jos:

student@sde:~$ cat sde-repository/tp01/tv-shows/young-sheldon/shelly  | grep Sheldon
My name is Sheldon

În exemplul de mai sus, operatorul | trimite textul afișat de comanda cat către intrarea standard a comenzii grep.

student@uso:~$ grep Sheldon de-repository/tp01/tv-shows/young-sheldon/shelly
My name is Sheldon

Observăm modul de folosire: grep PATTERN cale/către/fișier.

6. Utilitarul cut

Ne amintim de fișierul /etc/passwd conține informații despre toți utilizatorii din sistem.

student@uso:~$ cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
(...)

În Linux există filtrul de text cut prin care putem extrage doar anumite informații dintr-un output. Să zicem că vrem să extragem doar numele utilizatorilor, fără informațiile legate de grupuri sau home directory.

student@uso:~/uso-lab$ cat /etc/passwd | cut -f1 -d":"
root
daemon
bin
(...)

Argumentul -f1 specifică faptul că vrem prima coloană, iar argumentul -d: specifică delimitatorul de coloane, în cazul nostru :.

  1. Pornind de la comanda de mai sus, afișați numele utilizatorilor sortați alfabetic. (Hint: man sort)
  2. Folosind utilitarul wc, obțineți numărul de utilizatori din sistem. (Hint: man wc)

7. Shell scripting

Un script shell este un fișier text care conține comenzi și construcții specifice shell-ului. Un script shell începe cu construcția #!/bin/bash, denumită shebang care indică interpretorul scriptului; în cazul de față interpretorul este chiar shell-ul Bash. Dacă nu este specificat nici un shell prin shebang atunci implicit va fi luat shell-ul implicit (setat în /etc/passwd) asignat utilizatorului logat.

Spre exemplu, one-liners pe care le-am tot scris până acum ar putea fi puse într-un shell script și, mai mult, dacă sunt comenzi lungi și nu încap pe o linie le putem “sparge” în mai multe linii folosind separatorul \:

#!/bin/bash
 
export DATE=$(date +20%y%m%d) && \
mkdir -p /usr/share/snapshots && \
tar -cvpzf /usr/share/snapshots/$HOSTNAME_$DATE.tar.gz \
    --exclude=/proc --exclude=/lost+found \
    --exclude=/sys --exclude=/mnt \
    --exclude=/media --exclude=/dev \
    --exclude=/share/Archive /

ATENȚIE! În construcția de mai sus după \ trebuie să nu mai existe nici un caracter (nici măcar spațiu alb/trailing whitespaces)

Scriptul conține comenzi uzuale folosite în shell și alte comenzi care se regăsesc mai adesea în scripturi: while, if, for. Acestea nu sunt instrucțiuni, ci sunt tot comenzi shell; pot fi folosite, dacă sintaxa este corectă și în linia de comandă.

Argumente din linia de comandă

Un script moștenește variabilele de mediu ale shell-ului părinte precum HOME, BASH, IFS, USER. În script le putem folosi astfel:

#!/bin/bash
 
echo $HOME

Pe lângă aceste variabile, scriptul poate primi o serie de argumente din linia de comandă. Folosind următoarele variabile, putem referi argumentele primite de script din linia de comandă:

  • $* este un string ($1, $2 … $n) format din toate argumentele primite de script
  • $@ este o listă formată din argumentele scriptului
  • $1, $2 … $n reprezintă fiecare parametru din script
  • $0 este numele scriptului
  • $# este numărul de argumente primite din linia de comandă

Spre exemplu, să luăm următorul script arguments.sh:

#!/bin/bash
 
echo There are $# arguments to $0: $*
echo first argument: $1
echo second argument: $2
echo third argument: $3
echo the list of arguments: $@

Să apelăm scriptul cu 4 argumente:

student@uso:~$ bash arguments.sh banane cirese caise castraveti
   There are 4 arguments to arguments.sh: banane cirese caise castraveti
   first argument: banane
   second argument: cirese
   third argument: caise
   the list of arguments: banane cirese caise castraveti

8. Execuția comenzilor

Încheierea execuției unei comenzi

Atunci când rulăm o comandă aceasta își poate încheia execuția în două moduri: cu succes sau cu eșec. Atunci când își încheie execuția, orice proces întoarce un cod de eroare, care este un număr:

  • Dacă numărul întors are valoarea 0, procesul și-a încheiat execuția cu succes.
  • Dacă numărul întors are orice altă valoare, procesul și-a încheiat execuția cu eroare, iar codul întors poate fi folosit pentru a afla mai multe informații despre eroarea pe care a întors-o procesul. În pagina man a utilitarului ls este specificat:
    Exit status:
           0      if OK,
     
           1      if minor problems (e.g., cannot access subdirectory),
     
           2      if serious trouble (e.g., cannot access command-line argument).

Pentru a vedea codul cu care și-a încheiat execuția o comandă folosim sintaxa $?. Urmărim exemplul de mai jos:

student@uso:~$ ls Desktop/
todos.txt
student@uso:~$ echo $?
0
student@uso:~$ ls non-existent
ls: cannot access 'non-existent': No such file or directory
student@uso:~$ echo $?
2

Observăm că în cazul fișierului inexistet, comanda ls non-existent a întors valoarea 2, așa cum era specificat și în pagina de manual.

Înlănțuirea comenzilor în funcție de succes sau eșec

De multe ori vrem să executăm o succesiune de comenzi pentru a realiza o sarcină. De exemplu, atunci când vrem să instalăm o aplicație o rulăm trei comenzi:

  • O să actualizăm indexul surselor de pachete folosind apt update
  • O să instalăm pachetul care conține aplicația folosind apt install
  • O să rulăm aplicația pentru a valida că instalarea a fost cu succes.

Preferăm să înlănțuim cele trei comenzi într-una singură pentru că astfel putem să pornim tot acest proces, să plecăm de la calculator, iar când ne întoarcem avem tot sistemul pregătit.

Pentru a înlănțui comenzi în terminalul bash avem trei operatori disponibili:

Operatorul ; - este folosit pentru separarea comenzilor Urmăm exemplul de mai jos:

student@uso:~$ mkdir demo; cd demo; touch Hello; ls
Hello

În exemplul de mai sus am creat directorul demo, am navigat în interiorul său, am creat fișierul Hello și am afișat conținutul directorului. Am făcut toate acestea înlănțuind comenzile mkdir, cd, touch și ls cu ajutorul operatorului ;.

Operatorul ; este folosit pentru separarea comenzilor, dar nu ține cont dacă comenzile anterioare au fost executate cu succes sau nu. Urmăm exemplul de mai jos:

student@uso:~$ mkdir operators/demo; cd operators/demo
mkdir: cannot create directory ‘operators/demo’: No such file or directory
-bash: cd: operators/demo: No such file or directory

În exemplul de mai sus, comanda mkdir a eșuat deoarece nu a găsit directorul operators în care să creeze directorul demo. Cu toate acestea, operatorul ; doar separă comenzile între ele, așa că și comanda cd operators/demo a fost executată, și și aceasta a eșuat deoarece nu există calea operators/demo.

Folosim operatorul ; pentru a înlănțui comenzi care sunt independente unele de altele, și deci execuția lor nu depinde de succesul unei comenzi precedente.

Operatorul binar && (și logic) - execută a doua comandă doar dacă precedenta s-a executat cu succes. Exemplul anterior devine:

student@uso:~$ mkdir operators/demo && cd operators/demo
mkdir: cannot create directory ‘operators/demo’: No such file or directory

Observăm că din moment ce comanda mkdir a eșuat, comanda cd nu a mai fost executată.

Operatorul binar || (sau logic) - execută a doua comandă doar dacă prima s-a terminat cu eșec. Urmărim exemplul de mai jos:

student@uso:~$ (ls -d operators || mkdir operators) && ls -d operators
ls: cannot access 'operators': No such file or directory
operators
student@uso:~$ (ls -d operators || mkdir operators) && ls -d operators
operators
operators

În exemplul de mai sus, prima comandă ls a eșuat, așa că a fost executată comanda mkdir și apoi a fost executată ultima comandă ls. La cea de-a doua rulare, a fost executată cu succes prima comandă ls, așa că comanda mkdir nu a mai fost executată, și apoi a fost executată ultima comandă ls.

Pentru a rezolva scenariul de la care am plecat inițial, putem rula:

sudo apt update && sudo apt install -y cowsay && cowsay "Howdy"

Comanda de mai sus va actualiza indexul pachetelor sursă, va instala pachetul cowsay și va rula comanda cowsay pentru a valida instalarea. O astfel de înlănțuire de comenzi este numită oneliner.

Exerciții

  1. Scrieți un oneliner cu ajutorul căruia creați directorul ~/make-folder și apoi copiați conținutul directorului ~/sde-repository/tv-shows/young-sheldon în el.
  2. Actualizați onelinerul anterior astfel încât după copiere să pornească afiseze mesajul: “operation done”.
sde2/laboratoare/01.1615224514.txt.gz · Last modified: 2021/03/08 19:28 by ioana_maria.culic
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0