This is an old revision of the document!
Pour le laboratoire SdE, nous utiliserons Linux, la distribution Ubuntu.
Link catre prima parte din tema
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 |
À travers les laboratoires, nous utiliserons Git pour télécharger les fichiers nécessaires au laboratoire.
Git est un système de gestion de contrôle de source utilisé pour coder le code dans les projets logiciels volumineux.
Pour ceux qui souhaitent approfondir les concepts de la commande 'git' et des utilisations avancées, nous recommandons le cours en ligne sur gitimmersion ou Tutoriel Git pour les débutants: notions de base de la ligne de commande.
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.
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: ~ $ clone git https://github.com/upb-fils/sde
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
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
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”.
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
student@sde brooklyn99$ tree amy amy [error opening dir] 0 directories, 0 files
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
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.
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 ...
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 ...
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
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
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
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
student@sde: ~ $ pwd
La signification est 'print working directory' '
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
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.
Renommez le répertoire cloné /home/student/sde
en ligne de commande '/ home/student/sde-repository' '.
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
/home/student
.sde-repository/tp01
, cloné pour l'exercice précédent.ls
: student@sde: ~/tp01 $ ls -R
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
.
student@sde:~/sde-repository $ tree bash: tree: command not found...
Dans ce cas, nous devons l’installer:
student@sde:~$ sudo apt-get install tree
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.
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
"
, 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.
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
.
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ă.
|
) 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"
.
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ținuttail
- afișează ultimele 10 linii din conținutValoarea 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
).
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
.
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 :
.
man sort
)wc
, obțineți numărul de utilizatori din sistem. (Hint: man wc
)
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 /
\
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ă.
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
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:
0
, procesul și-a încheiat execuția cu succes.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.
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:
apt update
apt install
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.
~/make-folder
și apoi copiați conținutul directorului ~/sde-repository/tv-shows/young-sheldon în el.