Le shell est un interpréteur de commande en ligne. Chaque entrée sur un terminal est analysée et décomposée en terme d'instructions à exécuter. Ces instructions peuvent impliquer des commandes internes que le shell connaît et est en mesure d'exécuter directement, ou bien d'autres commandes déclenchant des programmes que le shell va tenter de localiser et de lancer. Le shell dispose d'instructions (structures de contrôle, ...) et de variables qui le rende en partie comparable à un langage de programmation, de sorte que l'on peut écrire des shell scripts, littérallement de petits ou moyens programmes rédigé en shell.
Un interpréteur shell exécutent trois types de commandes :
Les commandes internes [built-in commands], comme par exemple : cd, pwd, umask ... ou bien encore les éléments algorithmiques tels if .. then .. else .. endif, foreach ... ...
Les commandes externes indépendantes du shell et localisées dans les répertoires, comme par exemple : ls (
/bin/ls), find (/usr/bin/find) ... Ces commandes nécessitent la création d'un nouveau shell pour leur exécution contrairement à celles relevant de la première catégorie.Les commandes définies par un alias.
Le shell est le premier processus d'une session, son choix est indiqué dans le fichier /etc/passwd. IL est attaché au terminal console (login), ou à un pseudo-terminal (remote login, activation d'une fenêtre).
Le shell ouvre initialement trois fichiers standards :
l'entrée standard (
stdin, fd=0), par défaut le clavierla sortie standard (
stdout, fd=1), par défaut l'écranlasortie erreur standard (
stderr, fd=2), par défaut l'écran
Le shell lit sur son entrée standard
la commande jusqu'à la fin de ligne (
\n) et interprète les métacaractères et les opérateursles lignes de commandes jusqu'à la fin de fichier (
^D) dans le cas d'un script
Au lancement d'une commande, le shell
recherche l'éxécutable de la commande à l'aide du
PATHdans le cas d'une commande externeexécute en premier plan dans un processus fils la commande et en attend le résultat
exécute en arrière plan dans un processus fils la commande, sans en attendre le résultat (non bloquant)
il possède un mécanisme d'historisation et de rappel (et d'éditions des commandes tcsh) ;
il permet le contrôle des processus (suspension), reprise asynchrone (background) ou interactive (foreground)) ;
il permet de traiter les tableaux de caractères ;
il possède des directives de programmation proche du C ;
il possède un mécanisme de completion ;
il permet le calcul arithmétique.
Lors du login, csh exécute les instructions contenues dans le fichier /etc/csh.cshrc puis celles du fichier /etc/csh.login puis celles de ~/.cshrc (tcsh lit le script ~/.tcshrc, s'il existe et sinon ~/.cshrc) et enfin celles de ~/.login. La signification du caractère ~ est donnée en Section 1.6, « Métacaractères et autres caractères spéciaux du shell ». Lors de la fin de session (logout) csh ou tcsh exécutent les commandes des fichiers /etc/csh.logout et ~/.logout, dans cet ordre.
Un sous-shell, ne lit pas les fichiers suffixés en .login à son démarrage ni les fichiers suffixés en .logout à sa terminaison. Il lit par contre les fichiers~/.cshrc ou ~/.tcshrc. Un sous-shell est un shell lancé depuis un autre shell, en appelant directement son exécutable.
De ce qui précède, on déduit que les commandes à exécuter une seule fois pendant une session sont à placer dans les fichiers suffixés en .login (typiquement les variables d'environnement), tandis que les autres sont à placer dans les fichiers suffixés en .cshrc.
Le fichier ~/.cshrc contient typiquement :
la définition des alias ;
la définition des paramètres de fonctionnement ;
l'initialisation des variables.
Exemple 1. fichier ~/.cshrc
# ~/.cshrc
#
# $FreeBSD: src/share/skel/dot.cshrc,v 1.10.2.3 2001/08/01 17:15:46 obrien Exp $#
# .cshrc - csh resource script, read at beginning of execution by each shell
# see also csh(1), environ(7).
#
# Les alias
# -------------------------
alias j jobs -l
alias la /bin/ls -aoBG
alias lf /bin/ls -FABG
alias ll /bin/ls -loABG
alias gv /usr/X11R6/bin/gv -color -safer -quiet \
-media a4 -portrait
alias rm /bin/rm -i
alias wget `which wget` -N -c -S
alias emacs `which emacs` -q
alias gnuplot `which gnuplot` -background ivory
alias xdvi `which xdvi` -fg DarkSlateGray -paper a4
alias xfig `which xfig` -center -centim -pap a4 -po
alias dvips `which dvips` -t a4 -o out.ps
alias h 'history -r \!* | less'
alias psnup `which psnup` -pa4 -2up -m0.5cm
# Paramètres et variables.
# -------------------------
limit coredumpsize 0 # prevent core files from being written to disc
# A righteous umask
umask 077
set prompt='%B%n%b@%m:%c > '
set prompt2='%B%n%b:>> '
set path = (/usr/local/sbin /usr/local/bin /sbin /bin /usr/sbin \
/usr/bin /usr/X11R6/bin $HOME/bin)
set correct = cmd
/usr/X11R6/bin/xrdb -load ~/.Xdefaults >& /dev/null
if ($?prompt) then
# An interactive shell -- set some stuff up
set filec
set history = 2048
set savehist = 2048
set histfile = ~/.history
set mail = (/var/mail/$USER)
set notify
set addsuffix
set autolist
set machbeep = nomatch
set cdpath = ( ~ ~/bin )
set symlinks = ignore
if ( $?tcsh ) then
set echo_style = both
set histdup = all
set savehist = ( 2000 merge )
bindkey "^W" backward-delete-word
bindkey -k up history-search-backward
bindkey -k down history-search-forward
source ~/.tcsh_comp
endif
endif
Le fichier ~/.login contient essentiellement la définition des variables d'environnement.
Exemple 2. fichier ~/.login
# ~/.login setenv LC_CTYPE fr_FR.ISO8859-15 setenv PAGER less setenv MOZILLA_HOME /usr/X11R6/bin/mozilla setenv MACHTYPE i386 setenv EDITOR emacs setenv HOSTTYPE FreeBSD setenv CPUTYPE k7 setenv OSTYPE FreeBSD setenv TEXEDIT emacs setenv VENDOR amd setenv SHLVL 1 setenv LSCOLORS "ExFxbxcxBxdxHBhbafacad" setenv CLICOLOR 1 setenv CLICOLOR_FORCE 1 # COLORTERM to "rxvt" setenv COLORTERM "rxvt" # COLORFGBG to "default" setenv COLORFGBG "default" setenv RSYNC_RSH /usr/bin/ssh setenv CVSROOT /home/cvsroot setenv BLOCKSIZE K setenv TERM xterm-color [ -x /usr/games/fortune ] && /usr/games/fortune freebsd-tips
Le fichier ~/.logout contient essentiellement des commandes de suppression de fichiers inutiles.
Exemple 3. fichier ~/.logout
# ~/.logout
echo -n "clean up before logout ..."
find $HOME \( -type f \
\( -name a.out -o -name "*.bak" -o -name core -o \
-name "#*#" -o -name "#.*#" -o -name "*.o" -o \
-name "*~" -o -name ".*~" \) -exec /bin/rm -f {} \; > /dev/null \)
echo "... done"
echo "last connexion at [`date +%Y-%M-%d` a `date +%H:%I:%S`] pour [`logname`] s
ur [`tty`]" > ~/.deconnex
Il est possible à tout moment et notamment après une modification de réexécuter les fichiers au moyen de la commande source.
$ > source ~/.login $ > source ~/.cshrc
Avertissement
Dans les distributions xBSD on peut voir les deux fichiers suivants : /.login et /.profile (situés à la racine). Ils sont exécutés uniquement dans le mode mono-utilisateur [single-user mode]. Leurs modifications sont à faire avec le plus grand soin.
On parle de variables d'environnement car elles sont « automatiquement » transmises à tous les processus fils du shell, i.e. tous les processus lancés par ce shell.
Les variables qui suivent ont un sens particulier pour le shell (csh et tcsh), elles sont utilisées par certaines commandes du shell ou du système. Parmi elles, argv, cwd, home, path, prompt, shell et status sont toujours définies par le shell. Si l'on exclut les variables cwd et status, leur positionnement intervient seulement à l'initialisation. Ces variables ne sont plus modifiées, sauf éventuellement par l'utilisateur.
Tableau 1. Variables d'environnement
| Variable d'environnement | Sémantique |
|---|---|
argv | Arguments du shell, résultant de la substitution des paramètres positionnels.
$argv[1] correspond à $1, $argv[2] à $2 ... |
autologout | [tcsh] Positionné à un certain nombre de minutes, permet de déconnecter automatiquement l'utilisateur au bout de cette période d'inactivité. |
cdpath | Liste de répertoires alternatifs dans lesquels sera effectuée la recherche des sous-répertoires lors de l'utilisation de la commande cd avec un argument de type nom relatif. |
correct | [tcsh] Positionnable à all ou cmd. Dans le deuxième cas, permet la correction des erreurs de typos sur les noms de commandes. |
cwd | Chemin absolu du répertoire courant. |
echo | |
filec | Permet la completion des noms de fichiers. |
histchars | Chaîne de caractères à utiliser dans les substitutions de l'historique. Les éléments de cette chaîne remplacent les caractères standards, ainsi le premier caractère de cette chaîne remplace le '!', le second remplace le '^' ... |
histfile | Chemin d'accès au fichier d'historique. |
history | Permet de contrôler le nombre de lignes de l'historique. Noter que la dernière commande exécutée est toujours sauvegardée dans l'historique. |
home | Désigne le répertoire de localisation de celui qui invoque la commande. L'expansion de nom de fichier ~ se réfère à cette variable. |
ignoreeof | Le positionnement de cette variable permet au shell d'ignorer le caractère de fin de fichier quand il est généré depuis un terminal. Cela permet donc d'immuniser le shell d'une fin accidentelle déclenchée par la séquence ^D (lire <CTRL>-D). |
inputmode | [tcsh] Définit le mode en insertion (par défaut) ou en overwrite pour l'édition de la ligne de commande . |
mail | Indique le fichier dans lequel le shell contrôle l'arrivée de nouveaux messages.
Si la première valeur spécifiée dans mail est numérique, elle surcharge l'intervalle de temps entre chaque
vérification, fixé par défaut à 10 minutes.
Si la variable spécifie différents fichiers, chacun d'eux sera scruté pour détecter
l'arrivée de nouveaux messages.
|
noclobber | Modifie la sémantique des commandes de redirections > et >> permettant ainsi d'éviter un effacement accidentel. L'utilisation de > renvoit une erreur si le fichier existe. Quand à >>, elle se réfère uniquement aux fichiers existants. |
noglob | Si cette variable est positionnée, elle inhibe la fonctionnalité d'expansion des noms de fichiers. Surtout utile dans les scripts shell. |
nonomatch | Si cette variable est positionnée, il n'y a pas d'erreurs lorsque le mécanisme d'expansion des noms de fichiers ne correspond pas à tous les fichiers existants. Dans ce cas le motif est retourné. |
notify | Si positionné alors permet au shell de notifier de manière asynchrone la completion des jobs. Le comportement par défaut spécifie de présenter la completion des jobs avant d'imprimer le prompt. |
path | Définit l'ensemble des chemins dans lesquels le shell recherche les commandes externes à exécuter. |
prompt | Définit l'invite de commandes en mode interactif. |
rmstar | [tcsh] Si positionné, permet de demander à l'utilisateur confirmation lorsqu'il tape la commande rm *. |
savehist | Si l'argument est numérique, spécifie le nombre de lignes sauvegardées dans ~/.history,
quand l'utilisateur se déloggue. |
shell | Fichier dans lequel réside le shell. |
shlvl | [tcsh] Nombre de shell empilés, remis à 1 par un shell de login. |
status | Statut retourné par la dernière commande exécutée. |
time | Si cette variable est positionnée (valeur en secondes), alors toute commande dont la durée d'exécution dépasse cette valeur est suivie à sa terminaison de l'affichage de statistiques sur les temps utilisateur, système et réel consommés ainsi que le ratio temps utilisateur et temps système sur temps réel consommé. |
verbose |
Relations entre variables du shell et les variables d'environnement. En csh comme en tcsh certaines variables du shell et des variables d'environnement sont maintenues à des valeurs identiques par le shell. Ce sont les variables user et USER, group et GROUP, home et HOME, term et TERM, path et PATH, et enfin shlvl et SHLVL.
Les métacaractères jouent le rôle de classe de représentation des fichiers dans le contexte du répertoire courant si rien n'est précisé ou bien dans celui du répertoire explicitement nommé.
Le caractère ~ placé en première position désigne le répertoire personnel de l'utilisateur courant :
$ echo ~ /home/ikare $ls -l data/ total 8 drwxrwx--- 17 ikare ikare 2048 19 fév 17:25 docs drwxrwx--- 9 ikare ikare 512 5 nov 16:32 images drwxrwx--- 7 ikare ikare 512 18 avr 12:38 travail drwxrwxr-x 4 ikare ikare 512 5 nov 13:46 web
Le caractère * est substituable par n'importe quelle combinaison de 0 ou plusieurs caractères.
Exemple : Lister l'ensemble des fichiers possédant le suffixe
.shdu répertoire courant :$ ls *.sh cmd.sh fcomp.sh fdate.sh ftestparm.sh ftestvect.sh
Exemple : Lister les fichiers (non « cachés ») du répertoires courant :
$echo * cmd.sh fcomp.sh fcomp.sh.2 fdate.sh ftestparm.sh ftestvect.sh ftestvect.sh.2 shells.pdf shells.xml
Avertissement
Les fichiers commençant par le caractère . ou fichiers « cachés » d'Unix™ [dot files] ne peuvent être remplacés par aucun caractère, i.e. le caractère « * » est inopérant.
Le caractère ? est substituable par un unique caractère quelconque.
Exemple : Lister les fichiers commençant par le motif
ftet dont le suffixe est de trois caractères :$ ls ft*.?? ftestparm.sh ftestvect.shLes caractères [] permettent une substitution par un caractère parmi l'ensemble dénoté par les crochets.
Exemple : Lister les fichiers « cachés » du répertoire
$HOMEde l'utilisateur courant, dont le second caractère est compris entre 'a' et 'e' (le premier étant le « . ») :$ ls -d ~/.[a-e]* /home/ikare/.beryl /home/ikare/.dbus /home/ikare/.beryl-managerrc /home/ikare/.deconnex /home/ikare/.beryl-managerrc.7RFBPT /home/ikare/.dia /home/ikare/.cache /home/ikare/.dmrc /home/ikare/.config /home/ikare/.e /home/ikare/.cshrc /home/ikare/.emerald /home/ikare/.danpei /home/ikare/.evolution /home/ikare/.dasher
Autre exemple, utilisation de la négation (extension tcsh) marqué par le caractère ^ : Lister les fichiers cachés du répertoire
$HOMEde l'utilisateur courant, dont le second caractère n'est ni '.', ni 'a', ni 'b', ni 'c', ni 'd' ni 'e' (le premier étant un '.') :$ ls -d ~/.[^.a-e]* /home/ikare/.3ddesktop /home/ikare/.mail_aliases /home/ikare/.FVWM95-errors /home/ikare/.mailrc /home/ikare/.ICEauthority /home/ikare/.mcop /home/ikare/.Trash /home/ikare/.mcoprc /home/ikare/.Xauthority /home/ikare/.metacity /home/ikare/.fluxbox /home/ikare/.mozilla /home/ikare/.fontconfig /home/ikare/.mplayer /home/ikare/.fonts.cache-1 /home/ikare/.nautilus /home/ikare/.fvwm /home/ikare/.nvu /home/ikare/.gconf /home/ikare/.openoffice.org2 /home/ikare/.gconfd /home/ikare/.profile /home/ikare/.gftp /home/ikare/.prx4iXfy8 /home/ikare/.gimp-2.3 /home/ikare/.qt /home/ikare/.gkrellm2 /home/ikare/.recently-used /home/ikare/.gnome /home/ikare/.recently-used.xbel /home/ikare/.gnome2 /home/ikare/.rhosts /home/ikare/.gnome2_private /home/ikare/.saves-1567-ix.fremens /home/ikare/.gqview /home/ikare/.saves-1848-ix.fremens /home/ikare/.gstreamer-0.10 /home/ikare/.shrc /home/ikare/.gtkrc /home/ikare/.ssh /home/ikare/.gtkrc-1.2-gnome2 /home/ikare/.themes /home/ikare/.gtksee /home/ikare/.thumbnails /home/ikare/.history /home/ikare/.thunderbird /home/ikare/.icons /home/ikare/.vlc /home/ikare/.java /home/ikare/.wm_style /home/ikare/.kde /home/ikare/.wmndrc /home/ikare/.keylaunchrc /home/ikare/.xdvirc /home/ikare/.lesshst /home/ikare/.xemacs /home/ikare/.local /home/ikare/.xfce /home/ikare/.login /home/ikare/.xmms /home/ikare/.login_conf /home/ikare/.xscreensaver /home/ikare/.logout /home/ikare/.xsession-errors /home/ikare/.macromedia /home/ikare/.xwm.msgs
Les caractères { } permettent la substitution par un mot de l'énumération dénotée par les accolades.
Exemple : Lister les fichiers se terminant par les suffixes .xml et .pdf et .fo :
$ ls *.{xml,pdf} shells.pdf shells.xmlQuelques autres caractères spéciaux
Tableau 2. Autres caractères spéciaux du shell
Caractère Sémantique ; Séparateur de commande, i.e. opérateur de séquentialité. & Séparateur de commande qui place la commande qui le précède en arrière-plan, i.e. en exécution asynchrone. \ Quote le caractère qui le suit et notamment pour les caractères spéciaux, inhibe leur sémantique particulière. $ Accède au contenu de la variable. ' [quote] Quote le texte qui le suit jusqu'au ' fermant. ` [backquote] Considère le texte quoté comme une commande et la remplace par le résultat de son évaluation. " [double quote] Quote le texte qui le suit en interpolant les éventuelles variables qu'il contient. ! Substitution dans l'historique. | Tube [pipe]. > et >> Redirection de la sortie standard. < et << Redirection de l'entrée standard. # Marque le début d'un commentaire, i.e. pas d'expansion. && Et [And] logique. || Ou [Or] logique.