1. Principes de fonctionnement de csh

1.1. Rôle d'un shell

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 :

  1. 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 ... ...

  2. 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.

  3. Les commandes définies par un alias.

1.2. Algorithme de fonctionnement du shell

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 clavier

  • la sortie standard (stdout, fd=1), par défaut l'écran

  • lasortie 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érateurs

  • les 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 PATH dans le cas d'une commande externe

  • exé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)

1.3. Caractéristiques de csh

  • 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.

1.4. Fichiers de configuration de csh

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


Q : Quel est le rôle de la commande find dans le contexte du listing précédent (~/.logout) ?
Q :

Quel est le rôle de la commande find dans le contexte du listing précédent (~/.logout) ?

R :

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.

1.5. Variables prédéfinies et d'environnement

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
argvArguments 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.
cwdChemin 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.
homeDésigne le répertoire de localisation de celui qui invoque la commande. L'expansion de nom de fichier ~ se réfère à cette variable.
ignoreeofLe 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.
statusStatut retourné par la dernière commande exécutée.
timeSi 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.

1.6. Métacaractères et autres caractères spéciaux du shell

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 .sh du 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 ft et dont le suffixe est de trois caractères :

    
    $ ls ft*.??
    ftestparm.sh    ftestvect.sh
                                                
    
  • Les 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 $HOME de 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 $HOME de 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.xml                            
    
    
  • Quelques 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.

Skins :
Transparence
Simple
Page Accueil
Formation