IFT2240 (A06) - Sem. 1: Exploration de l'environnement UNIX


La discussion portera sur le shell bash. La plupart de ces sujets sont aussi traités dans le document des Séminaires UNIX.
  1. Différents Shells
  2. Comment changer de shell.
  3. Variables de shell
  4. Variables Csh versus Bourne Shell
  5. Fonctions importantes
  6. Démarrage
  7. Fichier d'initialisation ( .cshrc, .bashrc )
  8. Exercices

On fait l'hypothèse que vous connaissez les commandes de base de UNIX (ls, cd, cp, mv, rm, mkdir, rmdir, pwd, chmod, etc....). Dans cette démo, on va étudier comment vous pouvez modifier le contexte dans lequel UNIX exécute vos commandes. Notez que nous ne parlerons pas ici de l'environnement graphique; domaine du Window manager.

En gros, l'environnement comprend: Ces choses sont déterminées par:

Différents Shells

Les shells le plus courants sont les suivants: En général, les usagers de UNIX choisissent soit tcsh ou bash pour travailler au terminal et sh ou csh (ou perl) pour les scripts.

Pour obtenir une liste de shell installés sur un système unix exécutez la commande "cat /etc/shells". Pour les différences entre shells, voir: Tous les shells ont beaucoup en commun: et la commande ci-dessous fonctionnera de la même façon dans tous les shells.
% cmd  -ab toto *.c $USER "a b" >f1
Les différences (entre csh et sh) se manifestent dans la syntaxe de l'affectation aux variables et des énoncés de contrôle dans les scripts.

Comment changer de shell.

Pour connaître votre shell par défaut: echo $SHELL

Vous pouvez, à n'importe quel moment d'une session dans un shell, partir un autre shell en lançant sa commande et le quitter en tapant "exit". Par exemple:
bash% tcsh
tcsh% cd ~bergeret
tcsh% exit
bash%

Pour changer votre shell par défaut, vous devez changer le contenu du fichier .pshrc dans votre compte. Par exemple, pour utiliser le shell csh par défaut, il faudrait insérer cette ligne:
SHELL=csh

Variables de shell

Chaque SHELL (process UNIX) a une table de variables que l'usager peut modifier ou consulter. Au départ, la table contient des variables comme $HOME, $USER ou $HOST qui sont initialisées par le système (ou par les fichier d'initialisation de l'usager). On modifie les valeurs avec declare et export et on enlève la variable avec unset.

Il existe deux types de variables: les variables d'environnement et les variables locales. La différence est que quand on démarre un nouveau shell, seules les valeurs des variables d'environnement sont copiées dans la table du nouveau shell.

Note: La discussion courante sur les variables s'applique au bash.

Pour avoir accès à une variable, il faut préfixer la variable avec un "$". Par exemple "echo $USER" affichera l'utilisateur courant.

Variables d'environnement

Les variables d'environnement sont transmises aux programmes lorsqu'ils s'exécutent. De plus, elles sont aussi transmises lorsque l'on crée une nouvelle fenêtre de shell. Par contre, si un programme fils modifie une variable d'environnement, elle ne sera pas modifiée dans le shell parent. Voici des exemples de variables d'environnement: Pour modifier une variable d'environnement, utiliser la commande "export nom=valeur". Par exemple, pour ajouter "." dans le PATH et modifier la sorte de terminal:
% export PATH=.:$PATH
% export TERM=vt100
% echo $TERM
vt100

Variables locales:

Les variables locales sont locales au programme courant et au shell courant. Pour modifier une variable locale, utiliser la commande "nom=valeur". Par exemple,
% var=valeur
% nom="etienne"
% echo $nom
etienne
Par convention, les variables d'environnements sont en majuscules ($USER), et les variables locales, en minuscules ($user).

Pour obtenir la liste des variables locales utilisez la commande "set" sans paramètres et pour les variables d'environnement: "export"

Exemple:
% export
...
declare -x HOME="/u/leonard"
declare -x PATH="/opt/diro/gcc-3.2/bin:/usr/local/j2sdk1.4.0/bin:/opt/diro/bin:/
usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/hosts:/usr/X11R6/bin"
declare -x LOGNAME="leonard"
declare -x SHELL="/bin/bash"
declare -x MAIL="/mail/leonard/inbox"
declare -x USER="leonard"
declare -x TERM="cygwin"
declare -x PWD="/u/leonard"
declare -x HOSTNAME="deimos.iro.umontreal.ca"
...

% set
...
HOME=/u/leonard
HOSTARCH=Linux
HOSTNAME=deimos.iro.umontreal.ca
HOSTTYPE=i686
IFS=$' \t\n'
INPUTRC=/etc/inputrc
LAMHELPFILE=/etc/lam/lam-helpfile
LC_CTYPE=fr_CA
LD_LIBRARY_PATH=/opt/diro/gcc-3.2/lib:/usr/local/lib
LD_RUN_PATH=/opt/diro/gcc-3.2/lib
LESSCHARSET=latin1
LESSOPEN='|/usr/bin/lesspipe.sh %s'
LINES=50
LOGNAME=leonard
LS_COLORS=
MACHTYPE=i686-pc-linux-gnu
MAIL=/mail/leonard/inbox
...
Notez que pour certaines variables importantes ($USER, $HOME, $PATH), il y a des versions locales et d'environnement. De plus, pour ces 3 (au moins) la modification d'une copie change aussi l'autre.
% echo $USER
leonard
% USER=toto
% export
...
USER=toto
...
% set
...
USER=toto
...

Variables Csh versus Bourne Shell

cc csh (tcsh) sh (bash)
var. locale set a = 123 a=123
var. env. setenv a 123 a=123; export a

Fonctions importantes

Ces fonctions seront utilisées pour comprendre le démarrage et paramétriser l'environnement. En particulier, les fichiers d'initialisation contiennent beaucoup de alias et de export .

Exemples ypcat

% ypcat passwd | grep 2240

pasa3350:K*:22458:1079:Prof asa3350:/u/pasa3350:/bin/psh
pift2245:K*:42809:1366:Prof ift2245:/u/pift2245:/bin/psh
pcri2455:K*:42245:1354:Prof cri2455:/u/pcri2455:/bin/psh
dasa3350:K*:22457:1079:Demo asa3350:/u/dasa3350:/bin/psh
dift2245:K*:42808:1366:Demo ift2245:/u/dift2245:/bin/psh

   dift2245             = login
   :K*       = PW encrypte (n'apparaît plus au DIRO)
   :42808:1366            = UID:GID
   :Demo ift2245        = Noms
   :/u/dift2245         = HOME
   :/bin/psh            = Shell initial

% p .pshrc
SHELL=tcsh      # choix de sh, tcsh, ksh etc.....

Démarrage

- LOGIN - consultation de tables des usagers ( ypcat passwd )
        - vérification du PASSWD
        - initialisation du Working Directory selon $HOME
- (au DIRO) choix du shell selon .pshrc
- démarrage du SHELL
- exécution des commandes du fichier ".XXXrc" (pe: .bashrc ou .cshrc)
- exécution des commandes dans login

- exécution des commandes de l'usager

Fichier d'initialisation ( .cshrc, .bashrc )

Fichier typique (.bashrc - .profile)

[leonard@deimos leonard]$ cat .bashrc
. ~/.profile

inclure jdk
inclure gcc-3.2

alias l='ls -al --color'


[leonard@deimos leonard]$ cat .profile
. /usr/local/lib/Profile

Recherche de la commande

  1. recherche dans les commandes built-in (cd, echo, export, alias, ... )
  2. sinon cherche fichier dans repertoires du $PATH
% echo $PATH
/opt/diro/gcc-3.2/bin:/usr/local/j2sdk1.4.0/bin:/opt/diro/bin:/usr/local/bin:
/usr/bin:/bin:/usr/sbin:/sbin:/usr/hosts:/usr/X11R6/bin:/u/leonard/bin

% type echo
echo is a shell builtin

% type finger
finger is /usr/bin/finger

% which finger
/usr/bin/finger

Mise a jour du PATH (voir prochaine section pour les listes)

export PATH=$PATH:~/bin:.

Variables BASH: Liste de valeurs

Les variables locales peuvent contenir des listes. Par exemple, pour que la variable "liste" contienne la liste "1 2 3 4", on doit exécuter "liste=(1 2 3 4)". La variable ${#liste[@]} contient la taille de la liste $liste, et pour accéder à un item de la liste, il faut faire ${liste[i]} où i est l'index de l'item (le premier item étant à l'index # 0).

Creation de nouveau shell

Ci-dessous, on montre que les variables locales ne sont pas copiées.
$ a=111               # on est dans sh
$ b=222; export b
$ csh                 # on va en csh

   1: echo $a
      a: Undefined variable.
   2: echo $b
      222
   3: setenv c 333
   4: bash

      $ echo $a $b $c
        222 333
      $ exit

   5: exit

$ echo $a $b $c
  111 222
$

Exercices

  1. Comprendre ce que font les commandes suivantes:
  2. Trouver le numéro d'utilisateur et de groupe des usagers suivant:
  3. Modifier votre PATH pour faire "a.out" au lieu de "./a.out" pour exécuter un programme compilé en C (ajouter "." à votre $PATH).
  4. Trouver où se trouve les commandes suivante (avec which):
  5. Trouver la modification que la commande "inclure jdk" fait sur la variable $PATH.
  6. Faire un raccourci de la commande "cd.." vers la commande "cd ..", et détruire ce raccourci (avec alias et unalias).
  7. Les variables d'environement PS1, PS2, PS3 et PS4 contrôle le "look" de votre prompt. Redéfinissez PS1 pour avoir un "look" personnel autant qu'informatif. Ces deux références vous aideront beaucoup: