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.
- Différents Shells
- Comment changer de shell.
- Variables de shell
- Variables Csh versus Bourne Shell
- Fonctions importantes
- Démarrage
- Fichier d'initialisation ( .cshrc, .bashrc )
- 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:
- un SHELL: le programme qui interprète les commandes au terminal et
lance l'execution des programmes
- les variables du SHELL qui gardent trace de choses comme: répertoire courant,
l'imprimante par défaut, le prompt etc....
Ces choses sont déterminées par:
- Fichiers systèmes accesibles par ypcat
- Fichiers d'initialisation de l'usager
Différents Shells
Les shells le plus courants sont les suivants:
- sh (bourne shell): Le plus ancien shell unix, sh est souvent
utilisé pour des scripts.
- bash(bourne again shell): une version étendue du
bourne shell et créé sur linux.
- csh (c-shell) et la version améliorée, le tcsh: shells
améliorées avec une syntaxe similaire à celle de C.
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:
- traitement des quotes: "" '' ``
- remplacement des variables: $USER
- redirection: > >> < 2>
- substitution de caractères wildcards: * ? [...]
- pipes: % ls | wc
- recherche de commandes: ($PATH ... % which ls)
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:
- $HOME: Indique le répertoire personnel de l'utilisateur courant.
- $PATH: Indique les chemins d'accès où chercher les programmes exécutables.
- $SHELL: Indique le chemin d'accès au login shell de l'utilisateur courant.
- $USER: Indique l'utilisateur courant.
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 )
- Ajout de répertoires a $PATH
- Définition d'alias
- Mise à jour de $CLASSPATH
- Définition du prompt
- inclure ( propre au DIRO )
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
- recherche dans les commandes built-in (cd, echo, export, alias, ... )
- 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).
- création et accès à une liste:
tab=( voici ma liste )
echo ${tab[@]} # Imprime: "voici ma liste"
echo ${tab[1]} # Imprime: "ma"
echo $tab[1-2] # ça ne marche pas (bash: tab: bad array subscript)
echo ${#tab[@]} # Imprime: 3
echo $tab # Oops, imprime: "voici"
echo $tab[1] # Oops, imprime: "voici[1]"
- Ajout d'élément à une liste
tab=(${tab[@]} plus grande)
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
-
Comprendre ce que font les commandes suivantes:
- ypcat passwd | grep vaucher
- cat /usr/include/* > AllInclude.h
-
Trouver le numéro d'utilisateur et de groupe des usagers suivant:
- leonard
- dift2245
- zemmourf
- vaucher
-
Modifier votre PATH pour faire "a.out" au lieu de "./a.out" pour exécuter un
programme compilé en C (ajouter "." à votre $PATH).
-
Trouver où se trouve les commandes suivante (avec which):
- pwd
- cp
- cd
- echo
- dir
- ls
- gcc
- sort
-
Trouver la modification que la commande "inclure jdk" fait sur la variable $PATH.
-
Faire un raccourci de la commande "cd.." vers la commande "cd ..", et détruire
ce raccourci (avec alias et unalias).
-
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: