TP Bash

L'environnement du bureau

Le menu de lancement

Les applications les plus courantes sont disponibles en cliquant sur le bouton Applications en haut à gauche de l'écran. Celui-ci ouvre un menu subdivisé suivant les besoins de l'utilisateur. De haut en bas vous trouverez :
  • Accessoires
  • Bureautique
  • Education
  • Infographie
  • Internet
  • Outils Système
  • Programmation
  • Science
  • Son et vidéo
Familiarisez-vous avec l'environnement graphique de votre poste de travail. Celui-ci vous permet de travailler avec 4 bureaux virtuels. Virtuellement vous disposez ainsi d'un écran 4 fois plus grand que votre écran de travail. Pour passer d'un bureau à un autre il suffit de cliquer sur l'une des 4 cases du panneau situé en bas à droite de l'écran.
écrans virtuels
A titre d'exemple ouvrez une fenêtre de terminal en choisissant dans le menu Applications le sous-menu Outils Système et en cliquant sur l'icône de l'un des trois terminaux disponibles.
écrans virtuels

Vous venez de lancer un shell, i.e une fenêtre vient de s'ouvrir dans laquelle vous pouvez taper des commandes (nous reviendrons à cette étape ultérieurement). Cliquez sur l'une des cases représentant un bureau virtuel, vous vous retrouvez avec un bureau vide. Votre fenêtre n'a pas disparu, elle se trouve en fait sur un autre bureau. Pour la retrouver, il suffit de cliquer dans la case de l'espace de travail où vous vous trouviez avant d'ouvrir le terminal.


Premières commandes

Cet exercice a pour but de vous familiariser avec les commandes les plus courantes du shell bash. Elles permettent essentiellement de manipuler les fichiers et les répertoires.

Lisez attentivement le mode d'emploi des commandes avant de les utiliser (commande : man).

echo et pwd

Une fois lancée votre session de travail, prenez connaissance du chemin d'accès à votre répertoire de travail initial grâce à la commande : echo $HOME. Vous pouvez aussi utiliser la commande pwd.

mkdir

Créez un répertoire $HOME/UE13 (respectez la casse) si ce n'est pas déjà fait. Dans ce répertoire, créez un sous-répertoire de nom Bash.

cd

Faites du répertoire Bash votre répertoire de travail. Vérifiez que vous êtes bien dans le répertoire Bash (commande pwd).

Création de fichier

En utilisant la commande echo et la redirection (caractère >), créez un fichier de nom identite_numeroduposte (exemple : identite_u1-001-1, attention à l'underscore). Pour le numéro de poste, il faut savoir que toutes les machines d'une salle de TP du bâtiment U1 ont pour identificateur : u1-salle-poste, par exemple pour la salle 001, les postes sont u1-001-1, u1-001-2, ..., u1-001-20. Ce fichier doit contenir une seule ligne ayant le format suivant :

nom ; prenom ; groupe_de_tp ; date_de_naissance

Cette ligne doit contenir des renseignements vous concernant (la date de naissance doit se présenter sous la forme année, mois et jour sans espace).

Exemple :

Turing ; Alan ; 1A ; 19120623

chmod

Modifiez les protections des répertoires UE13 et Bash et du fichier identite pour que les autres étudiants de votre groupe de TP puissent lire votre fichier identite_xxx.

cp

Recopiez dans le répertoire Bash les fichiers identités des étudiants présents dans votre rangée. Pour cela, déplacez-vous et demandez-leur le nom de leur répertoire de travail initial (ou home directory).

cat

Dans le répertoire Bash, créez un fichier nos_identites constitué de la concaténation des fichiers identite précédents.

ls

Créez un fichier de nom liste_commandes dans votre répertoire initial ($HOME), contenant la liste de tous les fichiers du répertoire /usr/bin.

pr

Créez un fichier dans votre répertoire initial ($HOME), de nom a_imprimer contenant la liste précédente sur trois colonnes avec le titre "Liste des commandes de base".

ln

Créez un répertoire tmp sous Bash. Créez dans ce répertoire tmp un lien de nom liste avec le fichier liste_commandes. Effacez le fichier liste_commandes, que constatez-vous ?

tail

Affichez le nom du fichier le plus ancien de votre répertoire courant.


Le réseau

La commande ifconfig

Sur le réseau internet chaque machine est identifiée par une adresse de la forme x.y.z.t, c'est l'adresse IP (Internet Protocol). Tapez la commande /sbin/ifconfig et vous allez voir apparaitre quelque chose de la forme

eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
     inet 10.9.186.142  netmask 255.255.248.0  broadcast 10.9.191.255
     inet6 fe80::a6bb:6dff:fecf:345b  prefixlen 64  scopeid 0x20<link>
     ether a4:bb:6d:cf:34:5b  txqueuelen 1000  (Ethernet)
     RX packets 143605  bytes 111646618 (111.6 MB)
     RX errors 0  dropped 571  overruns 0  frame 0
     TX packets 130709  bytes 130895978 (130.8 MB)
     TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
     device interrupt 16  memory 0x91200000-91220000

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
     inet 127.0.0.1  netmask 255.0.0.0
     inet6 ::1  prefixlen 128  scopeid 0x10<host>
     loop  txqueuelen 1000  (Boucle locale)
     RX packets 444  bytes 43192 (43.1 KB)
     RX errors 0  dropped 0  overruns 0  frame 0
     TX packets 444  bytes 43192 (43.1 KB)
     TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

Dans le bloc eth0 le champ inet contient l'adresse IP (plus précisément IPv4) de votre machine (inet6 étant l'adresse IPv6).

La commande host

Comme il est plus facile de retenir un nom plutot qu'une suite de numéros, une machine possède aussi un nom le plus souvent de la forme:

identificateur.domaine.pays.

Par exemple vous travaillez actuellement sur le domaine univ-tln et Ainsi le nom de la machine u1-001-12 est

u1-001-12.univ-tln.fr

Il existe des machines dont le rôle est de conserver dans une table, l'association adresse ip/nom, le réseau n'identifiant une machine que par son adresse IP. Ces machines s'appellent des serveurs DNS (Domain Name Server).
Afin de connaître le nom d'une machine à partir de son adresse IP il suffit de taper la commande: host adresse-ip
\(\clubsuit\) Quel est le nom de la machine dont l'adresse est 10.2.92.177 ?
La commande host permet aussi de retouver l'adresse IP d'une machine uniquement à partir de son nom.
\(\clubsuit\) Comment faire ?

La commande ssh

Les machines étant reliées au réseau, il est possible à un utilisateur quelconque de se connecter sur une autre machine afin d'en utiliser les ressources à condition bien sûr que :

  • la machine distante accepte les connexions extérieures,
  • l'utilisateur possède un compte sur la machine distante (ce qui se traduit par un login et un mot de passe).
Pour se connecter sur une autre machine on utilise la commande ssh dont la syntaxe est : ssh adresse-ip ou ssh nom_machine.
Ssh signifie secure shell ce qui signifie que tous les échanges d'information entre votre poste et la machine distante sont chiffrés de façon à ce qu'ils soient inintelligibles si on les intercepte. La syntaxe d'utilisation de ssh est la suivante:
ssh -l login nom_machine (ou adresse-ip)
L'option -l login n'est pas obligatoire, dans ce cas c'est votre login qui est utilisé sur la machine distante pour vous identifier. Dans tous les cas vous devrez fournir un mot de passe. Pour couper la connexion il suffit de taper logout.
Exemple : pour se connecter sur la machine u1-001-1.univ-tln.fr, il suffit de taper ssh u1-001-1.univ-tln.fr ou ssh IP (quelle est l'adresse IP de u1-001-1 ?).
ATTENTION : la première fois que vous vous connecterez sur une autre machine, vous obtiendrez un message du type suivant :
The authenticity of host 'u1-001-1 (10.9.185.211)' can't be established.
RSA key fingerprint is 33:76:79:d7:cc:f1:e5:f5:97:9c:98:1b:93:1f:aa:9e.
Are you sure you want to continue connecting (yes/no)?
Ssh étant un protocole sécurisé, ce dernier vous informe que vous tentez de vous connecter à une machine qu'il ne connaı̂t pas et que cela comporte un risque. Répondez yes à la question si vous n'avez aucun doute sur l'origine de la machine sur laquelle vous vous connectez.
\(\clubsuit\) Essayez de vous connecter sur la machine www.univ-tln.fr. Que se passe-t-il ? Expliquez pourquoi cela ne fonctionne pas ? Recommencez alors sur la machine de votre voisin de droite le plus proche (et pour le dernier de la rangée, la machine de son voisin de gauche le plus proche).
Remarque: Pour toutes les machines qui se trouvent sur un même domaine, il n'est pas utile de préciser leur nom complet lors d'une connexion réseau, on peut spécifier uniquement l'identificateur de la machine. Par exemple pour se connecter sur u1-001-1 il suffit de taper ssh u1-001-1.

La commande scp

Cette commande permet de copier un ensemble de fichiers d'une machine vers une autre d'où son nom SCP (Secure file CoPy). Scp est la version sécurisée de la commande cp. Elle permet d'assurer la confidentialité des fichiers échangés. Pour récupérer un fichier qui se trouve sur votre compte sur une machine distante il suffit de taper

scp login@nom_de_la_machine:chemin_source chemin_destination

ou

scp login@adresse-ip:chemin_source chemin_destination.

Il faut alors vous identifier avec votre mot de passe sur la machine distante. Vous pouvez aussi taper directement scp nom_machine, vous serez alors identifié sur la machine distante avec votre login local, vous devrez ensuite fournir votre mot de passe distant (ceci ne fonctionne donc que si votre login distant est identique à votre login local).
Il n'est donc pas possible de se connecter sur une machine sur laquelle vous n'avez pas de compte (comme pour ssh).
\(\clubsuit\) Exécutez les étapes suivantes:
  • Créez un fichier de nom mystere contenant des informations quelconques.
  • Copiez-le dans le répertoire /tmp.
  • Choisissez un poste de la salle de TP et (télé)copiez grâce à la commande scp le fichier mystere présent sur ce poste (il est dans le répertoire /tmp propre à ce poste).
  • Affichez dans la console le contenu du fichier ainsi téléchargé.

Configuration de Firefox pour l'accès au Web

Firefox est un logiciel qui vous permet de naviguer sur le Web afin de récolter diverses informations. Nous n'aborderons pas ici ce sujet, il ne fait aucun doute que vous dominez tous les aspects de la navigation par vos propres moyens. Nous donnons ici simplement quelques directives afin que votre navigateur soit configuré correctement afin d'accéder au Web.
\(\clubsuit\) Exécutez les étapes suivantes:
  • Lancez Firefox en cliquant sur l'icône :
écrans virtuels
  • Allez dans le menu Edition, sous-menu Paramètres et choisissez Accueil. Activez alors l'option Page d'accueil - Page vide, ceci évitera qu'à chaque lancement de votre navigateur celui-ci aille se connecter sur le site de Firefox, afin d'éviter d'encombrer inutilement la bande passante de l'Université.
  • Allez dans le menu Edition, sous-menu Général et choisissez Langue et apparence. Sélectionnez le thème Sombre, ceci afin de préserver votre rétine (et de diminuer la consommation électrique sur écran OLED). En effet, la lecture de textes en lettres noires sur fond blanc est préjudiciable à votre vue car un écran blanc émet plus de 1000 cd/m² quand les organimes de santé conseillent de ne pas dépasser 200 cd/m² (suivant les conditions lumineuses ambiantes).
  • Quittez Firefox et relancez-le, votre logiciel est maintenant configuré.

Remarque Importante : A chaque fois que vous consulterez une page Web externe à l'Université, le navigateur s'adressera directement au serveur proxy qui se chargera de la rapatrier à sa place. Pour que cela fonctionne, il faudra au préalable que vous vous soyez authentifié sur le serveur proxy. C'est pourquoi à chaque fois que vous lancerez le navigateur Firefox, une fenêtre d'authentification s'ouvrira lors de la première connexion vers l'extérieur. Vous devrez rentrer votre login et mot de passe qui figurent sur votre carte d'étudiant. Votre authentification restera active tant que le logiciel Firefox restera ouvert. Toutes les pages que vous consultez sont de cette façon stockées et associées à un utilisateur au niveau des serveurs centraux de la DSIUN et ceci pendant un an comme l'exige l'organisme RENATER responsable des réseaux universitaires.

Le Mail

Le réseau internet dispose d'un système de messagerie qui permet à tout utilisateur d'envoyer un courrier électronique à n'importe quelle personne dans le monde entier. Pour cela, chaque utilisateur possède une adresse électronique. Pour vous cette adresse (qui se trouve sur votre carte d'étudiant) est de la forme

prenom-nom-numero@etud.univ-tln.fr

Généralement la gestion du courrier est assurée par une machine appelée serveur de mail. Depuis Septembre 2006, le mail des étudiants n'est plus géré par un serveur situé sur l'université. Dans le cadre du projet transversal Université Numérique en Région Paca vous pouvez consulter votre courrier en vous connectant à partir d'un navigateur quelconque sur l'ENT (l'Environnement Numérique de Travail).

Autres commandes utiles

  • ping: cette commande permet de savoir si une machine est connectée sur le réseau en lui envoyant certaines informations et en attendant un accusé de réception. Elle permet aussi de controler la qualité du transfert entre votre machine et la machine distante en vous donnant une estimation sur le temps de transmission. Syntaxe: ping nom. Pour arrêter cette commande, tapez sur CTRL-C.
\(\clubsuit\) La machine yoda.univ-tln.fr est-elle sur le réseau ? et la machine wall-e.univ-tln.fr ?
  • tracepath: les informations qui transitent d'une machine à une autre passent par un certain chemin et sont relayées par des machines appelées passerelles. La commande tracepath vous renvoie la liste des passerelles rencontrées (éventuellement aucune), la dernière ligne correspond au nom (ou à l'adresse ip) de la machine distante. Syntaxe: tracepath nom.
\(\clubsuit\) Combien de passerelles empruntez-vous pour aller sur U1-001-1 ?
  • who: permet d'obtenir la liste des utilisateurs connectés sur votre machine.
  • w: comme who, mais fournit en plus pour chaque utilisateur le processus en cours d'exécution sur votre machine.

L'éditeur de texte emacs

Pour taper vos programmes ou tout autre texte, vous disposez sous Linux de plusieurs éditeurs de texte plus ou moins conviviaux. Emacs est un éditeur de texte robuste, puissant et proposant de nombreuses options telles que : la coloration syntaxique pour différents langages, la possibilité de définir des macros en fonction de l'extension du fichier, ... Pour lancer l'éditeur emacs vous pouvez soit :

  • cliquer sur son icône
écrans virtuels
  • le lancer à partir d'une fenêtre terminal en tapant emacs.
\(\clubsuit\) Exécutez les étapes suivantes:
  • Ouvrez une fenêtre de terminal si vous n'en avez pas,
  • tapez emacs et validez,
  • la fenêtre de Emacs apparaı̂t. Retournez dans la fenêtre terminal à partir de laquelle vous avez lancé Emacs et tapez la commande ls pour lister le contenu de votre répertoire courant. Vous n'obtenez rien. Pourquoi ?
  • Retournez dans la fenêtre de Emacs et quittez le logiciel en allant dans le menu File et en choisissant Quit (vous remarquerez qu'une séquence de touches est indiquée entre parenthèses : C-x C-c, qui est le raccourci clavier correspondant à la commande).
  • Retournez alors dans la fenêtre terminal et tapez emacs &, puis une fois la fenêtre Emacs ouverte, tapez dans votre terminal la commande ls. Que se passe-t-il ? Explication ?

Droits sur les fichiers et les répertoires

Familiarisez-vous avec l'éditeur Emacs en crééant différents fichiers texte par la commande au clavier C-x C-f (ou en cliquant sur le menu File).
Pour sauvegarder un fichier, il suffit de taper la séquence de touches C-x C-s ou de cliquer sur le menu File, puis sur le sous-menu Save. Lors de la première sauvegarde vous devrez rentrer le nom du nouveau fichier et dans quel répertoire vous voulez le sauvegarder dans la zone prévue à cet effet tout en bas de la fenêtre Emacs.
\(\clubsuit\) Exécutez les étapes suivantes:
  • Créez un fichier quelconque avec Emacs.

  • Vérifiez les droits par défaut appliqués par le système sur votre fichier.

  • Créez le fichier hello.py contenant les ligne suivantes :

    #!/usr/bin/python3
    
    print("bonjour le monde")
    
  • Exécutez le fichier hello.py par la commande ./hello.py, que se passe-t-il et pourquoi ?

  • Vérifiez les droits du fichier hello.py et déduisez-en la valeur par défaut de umask.

  • Pour vérifier votre réponse tapez la commande umask qui sans paramètres vous renvoie la valeur des droits par défaut.

  • Faites différents tests avec umask et chmod pour vérifier que vous avez bien saisi les différentes possibilités de ces deux commandes. En particulier, rendez le fichier hello.py exécutable et vérifiez sa bonne exécution.


Les processus

La commande ps autorise la visualisation des processus lancés à partir du terminal courant.
\(\clubsuit\) Tapez dans un terminal la commande ps. Quelle est la signification des champs PID et TTY ?
Pour pouvoir visualiser l'ensembles des processus vous appartenant en exécution (et pas ceux uniquement lancés à partir du terminal courant) tapez la commande ps x.
Quelques options de ps:
  • ps ux affiche la liste de tous vous processus avec votre nom,
  • ps aux affiche la liste de tous les processus précédés du nom de leur propriétaire,
  • ps l affiche pour chaque processus lancé à partir du terminal courant, le numéro du processus père PPID.
Remarque: Ces différentes options peuvent être combinées entre elles, par exemple ps lx donne la liste de tous vos processus en exécution, avec pour chaque processus le numéro de son père.
\(\clubsuit\) Exécutez les étapes suivantes:
  • à partir d'un terminal (xterm), lancez xclock en arrière plan (xclock &), ceci affiche une horloge,
  • à l'aide de la commande ps, repérez la xterm mère de xclock,
  • tuez cette xterm avec la commande kill -9 puis affichez la liste de vos processus en exécution : que constatez-vous ? Qui est le père de xclock ? Explication ?

Sous Unix TOUT est fichier

Nous allons dans ce paragraphe vous démontrez rapidement que sous Unix tout périphérique d'entrée-sortie correspond à un fichier.
\(\clubsuit\) Exécutez les étapes suivantes:
  • A partir d'un terminal, exécutez la commance cat /etc/passwd. Ceci a pour résultat de vous afficher le contenu du fichier des mots de passe. Au passage familiarisez-vous avec sa structure.

  • Exécutez la commande cat /etc/passwd > toto. Ceci a pour effet d'afficher le contenu du fichier des mots de passe dans un fichier toto situé dans votre répertoire courant. Vérifiez que ce fichier est bien présent.

  • Ouvrez une deuxième fenêtre terminal. Vous avez maintenant deux terminaux ouverts que nous appellerons T1 et T2. Chacun d'entre eux correspond à un fichier situé dans /dev.

  • Positionnez vous dans T2 et tapez la commande tty. Cette commande vous envoie alors le nom du fichier correspondant à T2, par exemple /dev/pts/1.

  • Laissez T2 ouvert et positionnez-vous dans T1. Tapez alors

    cat /etc/passwd > fichier_correspondant_a_T2

    Ceci a pour effet de recopier le contenu du fichier des mots de passe dans le fichier correspondant à T2. Quel est le résultat obtenu ?


Variables d'environnement, variables locales

\(\clubsuit\) Exécutez la commande env. Cette commande renvoie la liste des variables d'environnement associées à TOUS les interprètes de commande (shell), i.e. toutes les variables renvoyées par env sont utilisables aussi bien en csh, sh ou en ksh.

Gestion des variables

Affichage d'une variable : echo $nom.
Définition d'une variable d'environnement : export nom=valeur.
Destruction d'une variable d'environnement : unset nom.
Une variable d'environnement est connue pour le shell courant et par tous ses sous-shells. De même, toute variable d'environnement définie à la connection (login) est valable pour tous les shells (voir /etc/bash.bashrc).
\(\clubsuit\) Pour vérifier les affirmations précédentes, exécutez les étapes suivantes:
  • ouvrez un xterm,
  • tapez env,
  • faites export ZZ=7,
  • affichez les variables de votre environnement,
  • tapez alors csh. Vous venez de changer de shell.
  • Tapez la commande env. Que constatez-vous ?
  • Sortez du csh en tapant exit.
  • Lancez un nouveau terminal en arrière plan à partir de votre terminal,
  • dans la nouvelle xterm, affichez les variables d'environnement. Que constatez-vous ?
  • à présent, ouvrez une xterm en utilisant l'icône associée et recommencez le point précédent. Conclusion ?
Déclaration d'une variable locale : nom=valeur. C'est une variable qui n'est connue que du shell courant.
Destruction d'une variable locale : unset nom
\(\clubsuit\) Détruisez la variable d'environnement ZZ et reprenez l'exercice précédent en définissant ZZ comme une variable du shell. Vérifiez que vous avez bien compris la différence entre variable locale et variable d'environnement.

Le fichier .bashrc

Toutes les variables locales déclarées dans le fichier .bashrc situé à la racine de votre répertoire, seront connues de toutes les sessions bash (et uniquement de celles-ci). En effet ce fichier est interprété à chaque fois que l'on lance un processus shell (donc en particulier quand on ouvre une fenêtre terminal).
\(\clubsuit\) Créez ou ouvrez le fichier ~/.bashrc dans lequel vous définirez une variable locale. Ouvrez alors une nouvelle xterm et vérifiez que votre variable existe. Passez en csh. La variable existe-elle toujours ?
\(\clubsuit\) Pouvez-vous expliquer le phénomène suivant:
  • Dans le fichier .bashrc rajoutez la ligne a=3.
  • Ouvrez un nouveau terminal.
  • Tapez echo $a, puis a=$(($a+1)) (attention aux espaces !). Réaffichez alors la valeur de a.
  • Ouvrez un nouveau terminal. Tapez echo $a. Explication ?

Le Bash

Il existe différentes façons d'affecter une valeur à une variable en bash.

  • Méthode Standard : nom_variable=valeur. Si jamais la valeur contient des séparateurs, il faut alors l'encadrer par des apostrophes (appelées aussi communément cotes) sinon seule la portion située avant le premier séparateur sera contenue dans la variable.
  • Récupération du résultat d'une commande : il est possible d'affecter le résultat d'une commande à une variable. Pour cela il suffit d'encadrer la commande par des anti-cotes: nom_variable=‘commande‘ (autre possibilité : nom_variable=$(commande)).
  • Définition d'une variable de type tableau: nom_variable=(val1 val2 \dots valn). Cette instruction crée une variable de type tableau, on accède à un élément donné en précisant son indice (par exemple ${nom_variable[1]}).
Le contenu d'une variable var est représentée par $var.
\(\clubsuit\) A titre d'exemple, exécutez les étapes suivantes:
  • Tapez a=bonjour puis echo $a.
  • Tapez a=bonjour le monde puis echo $a.
  • Tapez a='bonjour le monde' puis echo $a.
  • Tapez a=‘who‘, puis echo $a[1]
  • Tapez a=(bleu blanc rouge), echo $a, puis echo $a[2].
\(\clubsuit\) Quelle différence y a-t-il entre les deux instructions suivantes:
  • a='bonjour le monde'
  • a=(bonjour le monde)

Les caractères spéciaux

Certains caractères ont pour le bash une signification bien particulière:

  • <  > : caractères de redirection pour les commandes.
  • | : caractère permettant l'enchainement de processus communicants.
  • ? : caractère joker pour les noms de fichiers. Représente un caractère quelconque.
  • *: caractère joker pour les noms de fichiers. Représente un ensemble quelconque (éventuellement vide) de caractères.
  • [ ]: caractères utilisés pour accèder aux éléments d'une variable de type liste. Ce sont aussi des caractères jokers pour les noms de fichiers qui permettent de spécifier un ensemble de caractères.
  • ': caractère utilisé pour empêcher le shell d'interpréter les caractères spéciaux présents sur la ligne de commande.
  • ": permet de construire une chaine après avoir interprété les caractères , $ et !.
  • `: caractère utilisé pour récupérer le résultat d'une commande
  • &: caractère utilisé pour lancer un processus en tache de fond.
  • \: caractère de despécialisation. Permet d'inhiber le rôle du caractère qui le suit.
  • !: caractère utilisé pour la gestion du rappel des commandes.
  • ( ): caractères utilisés pour la construction de variables de type liste.
\(\clubsuit\) Pour vous familiariser avec ces différents caractères et constater leur rôle particulier exécutez les commandes suivantes:
  • echo *, echo \backslash*, echo '*'
  • echo ', echo \backslash'
  • nom=toto, phrase='bonjour $nom', phrasebis="bonjour $nom"
  • echo $nom, echo $phrase, echo $phrasebis.

La variable et la commande history

La variable history permet de définir le nombre de commandes conservées en mémoire par le bash. Par exemple pour conserver en mémoire les 20 dernières commandes tapées, il suffit de faire set history=20. On manipule alors l'historique de la façon suivante:

  • La commande history affiche la liste des commandes conservées en mémoire chacune précédée d'un numéro,
  • !num, rappelle la commande numéro num,
  • !!, rappelle la dernière commande.

La variable PS1

La variable PS1 permet de modifier l'invite du shell. Exemples :

  • PS1=bonjour
  • PS1='bonjour maitre'
  • PS1='\s-\v\$ '

Remarque: Pour la variable PS1 des séquences d'échappement (des caractères précédés de \) ont une signification spéciale (\s le nom du shell, \v sa version, \d la date, ...), voir PROMPTING dans le man de bash.

Les mécanismes de redirection

\(\clubsuit\) Reprenez le fichier hello.py, créé précédemment et exécutez wc hello.py. Vous obtenez le nombre de lignes, de mots et de caractères du fichier.
Quelle commande faut-il taper pour que ce résultat soit stocké dans le fichier statistique ?
Effacez le fichier statistique. Quand on redirige la sortie standard d'une commande vers un fichier, la sortie erreur standard reste connectée à l'écran, constatez cela en exécutant wc ficxyz > statistique. Le fichier ficxyz n'existant pas vous devriez obtenir un message d'erreur. Remarquez cependant que le fichier statistique est créé et vide.
Effacez le fichier statistique. Exécutez wc ficxyz &> statistique. Que constatez-vous ? Consultez le contenu du fichier statistique.
Effacez le fichier statistique. Exécutez wc hello.py &> statistique. Consultez le contenu du fichier statistique. Déduisez-en le role de l'opérateur \(\&>\).
\(\clubsuit\) On désire exécuter la commande wc en redirigeant:
  • son entrée standard avec un certain fichier fic,
  • sa sortie standard sur le fichier statistique,
  • sa sortie erreur standard sur le fichier erreurs
Proposez une solution et testez la en utilisant, dans un premier temps pour fichier fic, le fichier hello.py, puis un fichier qui n'existe pas (indication : pensez à l'utilisation d'un sous-shell).

Le mécanisme des alias

C'est un mécanisme permettant de simplifier l'écriture de commandes à l'aide d'abréviations. C'est une sorte de macro-instruction.
Syntaxe : alias nom commande(s).
Exemples :
  • alias dir=ls (puis tapez la commande dir)
  • alias rm='rm -i' (puis essayez d'effacer un fichier par la commande rm)
  • alias process='ps ux' (puis tapez la commande process)
Suppression d'un alias : unalias nom
Attention à la façon dont sont interprétés les caractères spéciaux.

Les fonctions

Syntaxe : function nom { commande(s); }.

Paramètres des fonctions : les arguments d'une fonction sont référencés dans son corps de la même manière que les arguments d'un programme shell le sont, $1 référence le premier argument, $2 le deuxième, etc., $# contient le nombre d'arguments passés lors de l'appel de la fonction.

Exemple : function toto { mkdir $1; cd $2; } s'utilise par toto rep1 rep2 et permet de créer le répertoire rep1 et de positionner rep2 en répertoire de travail.

La commande find

Cette commande autorise la recherche récursive d'un fichier (ou de plusieurs à l'aide des caractères jokers) à partir d'un répertoire.
Syntaxe : find rep criteres.
Les critères sont :
  • -name, permet de spécifier le nom (ou le motif) à rechercher,

  • -type T, avec T = f (fichier), d (répertoire), b (périphérique

    en mode bloc), c (périphérique en mode caractère), l (lien).

    Exemple : find / -type d donne tous les répertoires en

    parcourant le disque à partir de la racine.

  • -size [+-] taille [ck], avec \(+\) taille maximum, \(-\) taille minimum, \(c\) taille en octets et \(k\) taille en kilo-octets, permet de spécifier une taille minimum ou maximum pour les fichiers recherchés

  • -user proprietaire, permet de spécifier le nom du propriétaire

  • -group groupe, permet de spécifier le nom du groupe propriétaire

  • -perm permissions, permet de spécifier des permissions spécifiques.

Exemple : find / -perm 741, donne tous les fichiers dont les droits sont rwxr----x
Si plus d'un critère est spécifié, ils sont tous appliqués (correspond à l'option -a, i.e au et logique). Sinon, on peut aussi les séparer par l'option -o (qui correspond au ou logique).
Exemple : find / -name '*.h' -o -size +20k. Permet de rechercher à partir de la racine tous les fichiers d'extension .h ou dont la taille n'excède pas 20k.
\(\clubsuit\) Pourquoi l'extension .h est délimitée par des cotes ?
On peut combiner les conditions logiques ou et et en utilisant des parenthèses.
Exemple : find / \( -user 101 -o -group 200 \) -a -size 120k. Cette commande lance la recherche de tous les fichiers dont la taille n'excède pas 120k et dont :
  • soit l'utilisateur a pour UID 101,
  • soit le groupe propriétaire a pour UID 200.
\(\clubsuit\) Pourquoi les parenthèses sont précédées du caractère \(\backslash\) ?
Pour chaque fichier trouvé par find, il est possible d'exécuter une certaine commande grace à l'option suivante: -exec commande options {} \;.
Exemple : pour effacer tous les fichiers qui m'appartiennent dans le répertoire /tmp on lance l'exécution de la commande :
find /tmp -user mon_uid -type f -exec rm {} \;

Exercices

\(\bullet\) Redéfinissez votre environnement de façon à ce que :

  • les 30 dernières commandes soient sauvegardées,
  • le prompt affiche le numéro de la commande en cours,
  • la commande mycd affiche le nom du répertoire destination et la liste des fichiers s'y trouvant (définissez un alias).
\(\bullet\) Créez une fonction cherche qui vous affiche le nom des répertoires où se trouve le fichier passé en argument (vous aurez besoin de la commande dirname).
\(\bullet\) Créez un alias ecore qui efface tous les fichiers core (image d'un processus dans un fichier) dans votre répertoire utilisateur et tous ses sous répertoires.
\(\bullet\) Ecrire la fonction protect qui recherche dans le répertoire passé en argument (et tous ses sous-répertoires) tous les fichiers ayant une permission d'écriture pour les autres et qui la retire (utilisez le man de find pour en savoir plus sur l'option perm).