Le korn shell

Le shell travaille en 2 etapes...

Les variables du korn shell


Les Langages de commandes

Les SHELL


Interface entre les utilisateurs et le système

Sélection de son shell par la commande chsh <logname> <shell>


les shells des HPs


/bin/sh les Bourne Shell (standard "universel")

/bin/rsh shell restreint (utilisé pour les accès extérieurs)

/bin/csh C like shell (Berkeley)

/bin/ksh Korn shell (devient le standard POSIX)


L'une des forces d'UNIX est que le shell est une application comme les autres sans aucune propriété spécial, (d'autre applications sont parfois lancées au login).


Les shells offrent les mécanismes :

- d'expansion de noms (*,?,[],¼)

- de substitution et d'alias

- de redirection, pipe et lancement en tache de fond

- de lancement des commandes

(recherche de l'exécutable automatique)


Un langage de programmation évolué avec

variables

structures de contrîle

procédures (et fonctions )

transmission de paramètres

gestion d'interruptions

Un des plus gros atout est de pouvoir écrire de nouveau outils :


des fichiers de commandes "shell script"

dont l'exécution peut Þtre lancée de la mÞme faÛons que les commandes standards.



Enfin toute commande UNIX a un code de retour "exit status" qui permet de signaler si elle s'est déroulée normalement ou non.


Les shells pourrons gr×ce à leurs instructions conditionnelles utiliser ces codes.


La convention (attention c'est l'inverse du C) est :


si le code de retour est


nul: le déroulement est normal


Non nul : déroulement anormal


ce qui nous donne pour valeur de vérité


nul == Vrai

Non nul == Faux.


[0== pas d'erreur , sinon numéro de la cause du déroulement anormal]


Le Korn Shell


Nous allons étudier le Korn shell essentiellement dans le but d'écrire des scripts pour lancer l'exécution d'un fichier de commande ksh,


Quatre solutions pour exécuter un fichier de commande com :

1) Rendre le fichier exécutable par la commande chmod


prompt ksh -> $ com


il y a dans ce cas création d'un processus shell lisant ses données (des commandes) dans le fichier com.


Attention: ceci impose que le fichier soit lisible, en plus d'exécutable.

De plus le Korn shell n'est pas le shell standard mais celui de la norme POSIX, par défaut un fichier de commande est considéré comme étant écrit en Bourne shell, les fichiers de commande devrons donc commancer par la ligne #!/bin/ksh.


2) Lancer un processus sh avec un paramètre :


$ sh com

Création d'un processus shell com doit Þtre lisible seulement.


3) Utiliser le shell courant pour réaliser la commande en redirigeant l'entrée du shell courant sur le fichier gr×ce à la commande interne "." du shell:

$ . com

(le fichier doit toujours Þtre lisible)


4) en recouvrant le shell :

$ exec com

attention ceci détruit le shell courant (exécution /lecture).


LANCEMENT DU SHELL (INVOCATION)

Le Korn shell au login exécute le fichier .profile de votre catalogue privé. ($HOME/.profile )

Utilisez ce fichier pour :

- initialiser des variables : PATH,TERM,PS1 etc ...

- executer des commandes particulières : mesg n

-paramèttrer la ligne : stty erase ÃH

De plus si vous avez positioné la variable ENV avec une référence de fichier ce fichier sera aussi exécuté par le ksh. Souvant utilisé pour les alias et les définitions de fonctions.


Au lancement du shell :

si $0 commance par le caractère - c'est un shell de login.


Les options :

-c chaine lecture des commande dans la chaine

-i shell interactif

-r shell restreint (permet d'offrire un accès réduit a votre machine).



Le mécanisme d'expantion de noms


On vas au moyen de caractères spéciaux désigner des ensembles de références, (on parle d'expressions rationnelles).


Un mot contenant un de ces caractères spéciaux d'expentions sera remplacé par la liste triée des noms de fichiers reconnus par l'expression.


les caractères spéciaux du mécanisme d'expention sont :

? remplace un caractère quelquonque

* peut remplacer par n'importe quelle chaäne mÞme vide

[€sauf si cela crée une référence commancant par "." ]

[....] un des caractères de l'ensemble

[c1-c2] un des caractères de l'interval de c1 à C2 compris.


~ subsitué par la valeur de HOME

~user subistué par la valeur de HOME décrite dans /etc/passwd pour l'utilisateur user

~+ valeur de PWD et ~- de OLDPWD

Le Korn shell permet en plus de travailler avec des listes de motifs séparés par le caractère | et accèpte les expressions suivantes:


Patterns

?(liste-motifs) reconnait optionellement un des motifs.


*(liste-motifs) reconnait zéro ou plusieurs occurences des ¹ motifs.


+(liste-motifs) reconnait une ou plusieurs occurences des ¹ motifs.


@(liste-motifs) reconnait exactement un des motifs.


!(liste-motifs) reconnait tout sauf un des motifs donnés.

Mécanisme interne du shell


==============================

le shell travaille en deux étapes


1) analyse et expantion de nom de la commande

2) execution de la commande ainsi transformée


==============================


Il faut faire attention à cet aspect double du traitement d'une commande il peut amener le programmeur inatentif a de penibles déboires.


exemple avec l'expantion des variables:


# la variable A n'est pas déclarée

B=toto

if test $A -eq $B

then

echo egaux

fi


La ligne contenant le test est transformée en

if test -eq toto

qui n'est pas syntaxiquement correcte !


La famille des "guillemets" 'quotes' et Áanti-quotesÁ


" : subsitutions réalisées permet de former un seul paramètre d'appel avec les valeurs de plusieurs variables


' : subsitutions non réalisées permet d'afficher quelques $$


Á: subsitution réalisées,

Attention ce qui est entre Á est considérer comme une commande shell est evalue et le résultat est subsitué à la chaäne entre Á.


Autre écriture possible des anti-quotes :

$(commande)



exercices : créer un fichier comme suit et expliquer le resultat

#!/bin/ksh

echo ls * $*

echo "ls * $*"

echo 'ls * $*'

echo `ls * $*`


Les variables du Korn shell


Affectation nom=valeur (sans espaces)


nom = une chaäne de caractères commancant par une lettre

valeur =une chaine ou une valeur numérique.


Accès au variables


$nom est substitué dans la ligne de commande par la valeur de la variable nom.


echo $LOGNAME -> transformé en echo dr puis exécuté.


Le shell travail encore en deux étapes :

1) substitution de toutes les variables par leurs valeurs

2) execution de la commande


en cas de d'ambiguité on délimite l'identifieur par des accolades


${nom}


les tableaux


set -A tab a b c d e f g h i j k l

echo $tab[3]

d

echo $tab[(($#tab[*]-1))]

l


variables standards positionées automatiquement par le ksh


# le nombre d'arguments positionels en décimal

- options du shell et options positionnées par set

? Valeur de retour de la dernière commande en décimal.

$ le numéro de processus du shell

! le numéro de processus de la dernière commande détachée.

COLUMNS Largeur de la fenÞtre (mise à jours automatique sous X).

ERRNO Valeur de errno du dernier echec d'un appel système.

LINENO Numéro de ligne dans le script en cours d'exécution.

LINES Hauteur de la fenÞtre (mise à jours automatique sous X).

OLDPWD Précédent répertoire de travail.

OPTARG Valeur de la dernière option manipulée par getops

OPTIND Index de la dernière option manipulée par getops

PPID Numéro du processus père du shell

PWD Répertoire courrant

RANDOM Générateur aléatoire 0 à 32767. Initialisable en positionant RANDOM avec une valeur numérique.

REPLY Positionnée par select avec un read sans argument.

SECONDS Nombre de secondes depuis le début du shell positionable.

PS1= valeur du prompt 1 "$ "

PS2= valeur du prompt 2 "> "

HOME votre catalogue privé

LOGNAME votre nom de login

PATH liste des répertoires dans lesquels sont recherchées les commandes externes.

TERM type du terminal (important sur vt320 il faut spécifier vt100)

Mécanisme de substitution


${#parameter} Si parameter est * ou @, le nombre de paramètre est substitué. Sinon la longueur du paramètre est substitué.

${#identifier[*]} Le nombre d'éléments dans le tableau est substitué.

${parameter:-mot} Si parameter existe et est non-nul, sa valeur est substitué sinon mot est substitué.

${parameter:=mot} Si le paramètre n'est pas positioné ou nul lui affecté mot, substitué sa valeur. (les paramètres de position ne sont pas affectable ainsi).

${parameter:?mot} Si parameter existe et est non-nul, sa valeur est substitué sinon mot est affiché et le shell se termine, si mot est oublier un message standard est utilisé.

${parameter:+word} Si parameter existe et est non-nul,mot est substitué; sinon rien est substitué.

Le mot n'est évalue que si il est utilisé comme chaine de substitution. Dans l'exemple suivant la command pwd n'est exécuté que si la variable d n'est pas positioné ou est nulle:


echo ${d:-$(pwd)}

Dans ce cas si le (:) et omit seule l'existance de d est testée.



Listes de Variables définies dans le sh courant


set


suppresion d'un variable


unset nom ¼


transmission de variables aux processus fils :


liste des variables transmises


env


export nom

permet de transmetre la variable nom aux procesus créés par le shell gràce à l'environement des processus UNIX.


variable protégées (lecture seule)


readonly nom


Lecture d'un variable sur l'entrée standard


read nom


Attention les variables du shell peuvent contenir plusieurs chaänes séparées par des <espace>


Les variables paramètre des fichiers de commandes


Quand on appel un fichier de commande shell on peut utiliser des paramètres d'appels.


Pour manipuler ces paramètre d'appels on dispose des vaiables

0 à 9 , *, @ et des opérateurs shift et set .


les variables $1 $2 ... $9 désigne les 9 premiers paramètres d'appel


$* est équivalent à "$1 $2 ¼" i.e. tous les paramètres d'appel

$@ est équivalent à "$1" "$2" ¼


$0 nom d'appel du script (ou de la fonction)


shift permet de renuméroté les paramètres d'appel

$2 devient $1 etc ¼

le premier paramètre est perdu !


set permet de positionner la valeur des paramètres d'appel.


Les variables suivantes sont utilisées par le shell

CDPATH répertoire de recherche pour la commande cd

ENV référence du fichier d'initialisation essentiellement utilisé pour desfinir des alias et des fonctions.

HOME argument par defaut de la commande cd

PATH Répertoires de recherche des commandes.

PS1 Prompt principal, la valeur de cette varaible est évalue avant affichage, sa valeur par défaut est "$ " Un caractère ! y est substituer par le numéro de la commande. (pour entrer un ! placer !!)

PS2 Prompt secondaire par défaut "> ".

PS3 Prompt de la boucle select par defaut "#? ".

PS4 Prompt du mode trace (évaluation avant affichage), par defaut "+€".

SHELL Référence absolu du shell.

TMOUT Si cette variable est positionnée avec un valeur strictement positive , le shell se termine au bout de ce nombre de second si aucune commande n'est entrée après l'affiche du prompt.


exemple :


$ set toto titi tata

$ echo $2

titi

$ shift 2 ; echo $1

tata

$ set `who am i`

$ echo $*

bayreuth!dr ttyp1 Jul 26 18:52

$ echo $0

sh

$ echo $$

245

$ echo $#

5

$ shift 2

$ echo $#

3

$ read a

ceci va devenir les nouveaux paramètres

$ set $a

$ echo $4 $6 $3 $2 $4 $5 $1

les paramètres devenir va les nouveaux ceci

$ readonly a

$ read a

nouvelle valeur de a

a: is read only

$


Les fonctions Korn shell


définition d'une fonction interne au shell (plus rapide) sans lancement de sous-shell


nom() { liste de commandes ; }

ou bien

function nom { liste de commandes ; }


La variable nom apparaät dans la liste des variables et peut Þtre supprimée par la command unset nom

on peut utiliser les variables de position $1 $2 ¼ dans la fonction ce seront les paramètre d'appel de la fonction comme pour l'appel d'un script.


Attention les fonctions ne sont pas exportable.


#!/bin/ksh

# commande compte

fac

fac() {

case $# in

0) break;;

1) echo 1; break;;

*) echo -n 1+ ; shift ; fac $* ; break;;

esac

}

fac h h h h hh h h h hh hjjlj jk j j jhg hgjh

fac

fac 1 2 3 4


exécution de compte

compte: fac: not found

1+1+1+1+1+1+1+1+1+1+1+1+1+1+1

1+1+1+1

Les redirections en Korn shell

Caractères spéciaux

Mécanisme de redirection


>référence redirection de la sortie standard (echec si le fichier existe et que la variable noclobber est positionnée).

>|référence idem sans prendre en compte noclobber

>>référence redirection sans troncature du fichier référence (écriture a la fin du fichier).

<référence redirection de l'entrée standard

<>référence idem avec ouverture en écriture en plus.

2> ref redirection de la sortie erreur standard

2>> ref redirection de la sortie erreur standard en mode append.


<& chiffre redirection d'un des descripteur standard

>& chiffre

2>& chiffre sur le descripteur chiffre.


<&- >&- 2>&- fermeture


digit> redirection du descripteur de fichier digit. Par exemple:

2>erreur redirige la sortie erreur sdtandard(2) sur la fichier de référence erreur.

(liste de commandes)

exécution dans un sous-shell, nouveau processus

{liste de commandes}

exécution dans le [sous]-shell courant.


$ echo toto >fic ; read a <fic ; echo $a

toto

$ compte 2>/dev/null

1+1+1+1+1+1+1+1+1+1+1+1+1+1+1

1+1+1+1

$ compte >/dev/null

compte: fac: not found

$


Opérateurs ; , & , | , && , || , |&

com1 ; com2 lancement en séquence attente de la fin de com1 avant l'exécution de com2

com1 & com2 lancement en mode détaché exécution imédiate des deux commandes, com1 est exécuté de faÛons asyncrone.

com1 | com2 redirection de la sortie de com1 dans l'entrée de com2.

com1 && com2 ET la commande com2 n'est exécuté que si com1 se termine avec un code de retour nul (vrai).

com1 ||€com2 OU idem avec un code de retour non-nul (faux)

com1 |& création d'un co-processus.




$ true && echo ok

ok

$ false &&€ echo ok

$ true || echo ok


$


Sous commande

possibilité dans un shell de faire interpréter une suite de commande comme des commandes d'une sous commande (un autre shell, un éditeur etc ¼)


com <<mot_clef

les commande placées

ici

sont interprétées

par la commande com

mot_clef


exemple


#!/bin/sh

# tdc fait des additions ....

dc <<Kaboum

$1

$2

+

p

q

Kaboum



$ tdc 4 5 6

9

$



SUCRE SYNTAXIQUE

STRUCTURES DE CONTR”LE



Code de retour


= 0 (Zéro) VRAI exécution réussie

¹ 0 (Non nul) FAUX erreur à l'exécution


La commande test deux formats


test expression

[[ expression ]]

attention il faut bien séparer les crochets de l'expression


La valeur de retour de la commande test est 0 si l'expression est vrai et non nulle sinon.



test sur les entiers


test i1 -eq i2

-eq = equal

-ne = not equal

-gt = greater than

-ge = greater or equal

-lt = lower than

-le = lower or equal



combinaisons d'expressions

(expression)

! négation

-a conjonction (and)

-o disjonction (or)


attention le -a est plus prioritaire que le -o .



code de retour d'une commande composé = code de retour de la dernière commande.



Quelques commandes utiles


commande code de retour effet

: 0 interne-Néant

true 0 externe-Néant

false 255 externe-Néant



Tests sur les chaänes de caractères :

test -z chaäne test de longueur nulle

test -n chaäne test de longueur non nulle

test ch1 = ch2

test ch1 != ch2

test chaäne vrai si chaäne existe, chaäne non nulle



Tests sur les fichiers


-r file true if the file exists and is readable.

-w file true if the file exists and is writable.

-f file true if the file exists and is not a directory.

-d file true if the file exists and is a directory.

-s file true if the file exists and has a size greater than zero.

-b file true if the file exists and is a block special device.

-c file true if the file exists and is a character special device.

-h file true if the file exists and is a symbolic link.

-g file true if the file exists and has setgid bit set.

-k file true if the file exists and has sticky bit set.

-u file true if the file exists and has setuid bit set.



Test de rattachement à un terminal

test -t [entier, 1 par défaut]

test si le descripteur est rattaché à un terminal.

Sélection


if liste_de_commandes1

then liste_de_commandes2

[ else liste_de_commandes3 ]

fi


si code de retour de liste_de_commandes1 = 0

exécution de liste_de_commandes2

sinon exécution de liste_de_commandes3


Imbriqués

if ¼

then ¼

elif ¼

then

elif ¼

¼

fi



if test -f toto

then echo toto existe

else

echo il faut cree toto

echo merci d'avance

fi


Sélection suite le branchement multiple


case chaäne in

motif) liste_de_commandes ;;

motif) liste_de_commandes ;;

motif) liste_de_commandes ;;

esac


Les motifs sont fabriqués avec les caractère spéciaux d'expention de nom.

L'interpréteur cherche le premier motif que la chaäne satisfait.

exécute les commandes associées et sort du case.


Le motif * permet d'avoir un comportement par défaut il faut évidement le placer en dernière position.


exemples de motifs :


case $1 in

*o*t*| *t*o*) echo $1 contient les lettres o et t ;;

*o*) echo $1 contient la lettre o ;;

*t*) echo $1 contient la lettre t ;;

*) echo $1 ne contient ni t ni o ;;

esac


Itération Bornée


for variable [ in chaäne chaäne ¼ ]

do

liste de commandes

done


par défaut la liste de chaäne est $*


la commande est exécutée successivement pur toutes les valeurs énumérées, qui sont affectées successivement à la variable de contrîle.


par exemple :


for i in *

do

echo $i

done


est équivalent à ls.



Itérations non bornées


Boucle tant que :


while commande1

do commande2

done


La commande2 est exécuter tant que la commande1 a un code de retour nul. (condition de continuation).


Boucle jusqu'à ce que


until commande1

do commande2

done


La commande2 est exécuter jusqu'à ce que la commande1 ait un code de retour nul. (condition d'arrÞt).



Sorties Brutales des boucles


break [n] sort de n (1 par defaut) de n niveaux de boucle

continue [n] fait continuer l'exécution a la fin de la nième boucle


ex:le code suivant est équivalent à la commande ls

for i in *

do for j in 1 2 3

do

if test $j -eq 2 ; then continue 2 ; fi

echo $i

done ; done

Le traitement des signaux


trap handler nsig1 nsig2 ¼


La commande trap permet de spécifier le comportement du shell à la réception d'un signal (indiqué par son nom ou son numéro).


A la réception d'un signal la commande handler est exécutée

Puis le shell reprend sont exécution au point de réception du signal.

Dans le cas de reception simultané de plusieurs signaux le korn shell exécute les handler dans l'odre défini par les numéros de signaux.


trap "" 2 3 signaux intr et quit ignorés


trap - sig comportement par défaut

( interruption, et interruption et création d'un core.)


Si un signal était ignoré par le shell a son lancement il n'est plus possible de positioner un handler sur se signal!


trap handler EXIT la commande handler est réalisé a la fin du script quelle que soit la raison de terminaison (excepté SIGKILL). Si le trap est défini dans une fonction le handler est exécuté a la fin de la fonction.


Le korn shell introduit des signaux spéciaux


DEBUG le handler est exécuté après chaque commande

ERR le handler est exécuter après chaque commande de code de retour non nul.


trap sans argument affiche la liste des handler associés a chaque signal




Le signal 1 (HUP) de fin de session


Le shell propriétaire d'une session envoi quand il meurt un signal 1 à tous les processus de la session afin que vous soyez délogé proprement. Mais si vous voulez lancer un processus qui doit tourner pendant votre absence il faut utiliser la commande nohup .


nohup commande

le processus créé ignore le signal SIGHUP de fin de session.


il est possible pour un script de se protéger avec

trap "" 1.



La commande select


select var [in mots¼] do list done


echo choix de véhicule

select a in avions bateaux voitures camions

do

echo bravo vous avez choisi un $a

echo "un autre choix de véhicule (^D pour finir)"

done


Si in word est omis la variable $* est utilisé.


La commande select prompt l'utilisateur a choisir parmi les differents mots de la liste et place le mot selectioné dans la variable var l'ensemble de la ligne est placé dans la variable REPLY.

Si la réponce n'est pas dans l'interval d'entier légaux la variable var est positionée a nul.


Controle de taches


On appel un tache un groupe de processus réalisant une commande.

Les taches sous ksh peuvent Þtres dans trois états bien distincs


1) Actives en premier plan

2) Actives en tache de fond

3) Stoppées en tache de fond.


L'état 1) est l'état de toute taches lancée normalement.

Pour l'état 2) il suffit de lancer la commande en tache de fond avec l'opérateur &. Si la commande utilise le terminal (tty input et/ou output) elle est stoppée et passe dans l'état 3).

On peut faire passer un processus de l'état 1) à 3) avec le caractère spécial <susp> ^Z


Pour connaitre les processus en tache de fond :

jobs -l


Manipulation de ces taches :

fg %job faire passer la tache en premier plan (mode 1)

bg %job faire passer la tache en mode actif en tache de fond.

kill -sig %job tuer la tache


La tache %job peut Þtre accèdée par une des références suivantes :

%nombre la tache numéro

%mot les taches commencant par mot

%?mot les taches contenant mot

%% ou %+ la tache courante

%- la tache précédente


PID le PID d'un des processus de la tache




exemple de manipulations de taches :

$ vi &

[1] 19546

[1] + Stopped (tty output) vi &

$ vi <-- frappe de ^Z

[2] + Stopped vi

$ jobs -l

[2] + 19551 Stopped vi

[1] - 19546 Stopped (tty output) vi &

$ kill -9 %1

[1] - Killed vi &

$ jobs -l

[2] + 19551 Stopped vi


Alias


Le premier mot de chaque commande est testé pour l'existence d'un alias, et renplacé par son alias si il existe. Si le dernier caractère de l'alias est un blanc le mot suivant dans la commande est aussi testé pour la presence d'alias.

alias [-x] [nom=chaine]

-x pour exporter les alias aux sous-shells

Création:

alias nom=chaine


Destruction:

unalias nom


utilisation :

$ alias history='fc -l'

$ history

1 alias history='fc -l'

2 history

$ alias cou="echo coucou"

$ cou

coucou

$alias # liste des alias

autoload=typeset -fu

false=let 0

functions=typeset -f

hash=alias -t -

history=fc -l

¼


Expressions arithmétiques


Si une varaible est typé entière par la commande

typset -i variable

alors toute valeur d'affectation de la variable est evalué comme une expression arithmétique.


Un expression entre double parenthèses précédée d'un dolars est interprétée comme une expression artihmétique et évaluée et substituée dans la ligne : $((expression)), l'expression est considérée comme entre quote, les caractères spéciaux sont ainsi déspécialisés.


Par exemple


$ echo $((5%3))

2

$ typeset -i nb

$ nb=78+6-3

$ nb=$(( (-4*-9)/6 ))

$ echo nb

6

$


Test et expression arithmétiques :


exp1 -eq exp2 Vraie si exp1 est égale à exp2. (equal)

exp1 -ne exp2 Vraie si exp1 est différente de exp2.(not equal)

exp1 -lt exp2 Vraie si exp1 est inférieur à exp2.(less than)

exp1 -gt exp2 Vraie si exp1 est supérieur à exp2.(greater than)

exp1 -le exp2 Vraie si exp1 est inférieur ou égale à exp2.

(less or equal)

exp1 -ge exp2 Vraie si exp1 est supérieur ou égale à exp2.

(greater or equal)


[attention:les opérateurs de comparaison >,>=,<,<=,==,!= sont utilisé pour les chaines de caractères].



Une expression composé peut Þtre fabriqué avec les primitives suivantes, litées dans l'ordre décroissant de priorité :


(expression) Vraie, si expression est Vraie.Utile pour regrouper les expressions

! expression Vraie si expression est fausse.

exp1 && exp2 Vraie, si exp1 et exp2 sont Vraies.

exp1 || exp2 Vraie, si exp1 ou exp2 est Vraie.



Utilisation dans une boucle :

#!/bin/ksh

#creation d'une suite super croissante dans un tableau A

typeset -i somme=0 indice=0

#nombre d'elements de la suite donner en entrée

typeset -i n=$1

if [[ ($n -lt 0) || ($n -gt 1023) ]]

then

echo "usage : $0 n avec 0<= n <= 1023"

exit 1

fi


while [[ $n -gt $indice ]]

do

somme=$RANDOM+somme

A[$indice]=$somme

indice=indice+1

done


indice=0


while [[ $n -gt $indice ]]

do

print -n "A[$indice]=$A[$indice] "

indice=indice+1

done




LesConstantes

[base#]n

par exemple la constante 8 s'écrire

2#1000 8#10 8 36#8

la base peut variée de 2 à 36 la base 36 repréenter par 0-9A-Z



Les opérateurs


Les opérateurs sont ceux du language C soit


- moins unaire

+ addition

* multiplication

/ division

% modulo

- soustraction



La commande interne getopts


getopts optstring var [arg ...]


La commande getopts extrait les options définies dans la chaine optstring une à une des argument [par defaut les arguments d'appel du shell] et place cette option dans la varaible var.


Dans optstring si un caractère est suivit de : cela indique que l'option est suivie d'une chaine qui est alors stoquée dans OPTARG




$ while getopts abf: op -a -e -b -f toto bib

> do

> case $op in

> a) echo option A ;;

> b) echo option B;;

> f) echo fichier $OPTARG

esac

done

option A

ksh: getopts: e bad option(s)

option B

fichier toto



banner affiche les paramètres en grande lettres


basename dirname

découpe une référence abolue /dir1/dir2/nomdebase

basename le nom du fichier sans la partie directory:nomdebase

dirname seulement le nom du directory: /dir1/dir2


bc calculateur intéractif à très grande précision


cal [année]

affichage d'un calendrier de l'année


cb enjoliveur de programmes C (C beautifier)

ne pas faire cb <toto.c >toto.c !!!!

mais cb <toto.c >new.toto.c

ou {rm toto.c ; cb >toto.c} < toto.c


cat [-su] [-v [-t] [-e]] files...

envoie le contenu des fichiers files sur la sortie standard

l'entrée standard est symbolisée par un -

Par défaut l'entrée standard (stdin) est envoyée sur la sortie standard (stdout).

options:

-s pas de messages d'erreur sur les fichiers inexistants

-u pas de bufferisation de la sortie (char par char)

-v affichage des caractères non imprimables avec le format : ^X (000 à 040) et ^? (del 0177) M-x pour les autres ou x est le caractère associé au 7 bits de poids faible

-e affichage d'un $ a la fin des lignes

-t affichage de <tab> par ^I


exemple:

cat fic1 - fic3 <fic2 >toto équivalent à

cat fic1 fic2 fic3 >toto


cd -> exercice donner la définition de cd en franÛais !


chown [-R] owner file ...

chgrp [-R] group file ...

change le propriétaire ou le groupe des fichiers (-R récursivement dans les sous catalogues)

comm [- [123]] file1 file2

selection/élimination de lignes communes à deux fichiers

envoie sur stdout trois colonnes de mots avec

ceux file1 uniquement /de file2 uniquement / mots communs

les option permet d'éliminé une ou plusieurs colones.


cp [-ifpRr] [file1 file2] [files... cat] copie de file1 sur file2

copie des files dans le catalogue cat

options:

-i interactif

-f détruit file2 ou cat (danger!!!)

 -p sans changer les permission ni le propriétaire si possible.

-r|R récursif avec pour -R


cut , paste Manipulation de fichiers

cut: permet d'extraire des colonnes d'un fichier

paste: permet de fusionner en colonnes plusieurs fichiers


date donne la date courante,si superU permet de changer la date


dc (desk calculator) calculette



df block disk libres affiche le nombre de block libre sur chaque disque logique

ex: sur woodstock

Filesystem kbytes used avail capacity Mounted on

/dev/dk0a 23783 20166 1238 94% /

/dev/dk0c 66487 59654 184 100% /usr

/dev/dk0d 22759 550 19933 3% /tmp

/dev/dk0e 95111 72661 12938 85% /etudiants

/dev/dk0g 85455 36196 40713 47% /usr/adm

fillmore:/users/ens 1045329 829221 111575 88% /users/ens

fillmore:/users/staff 1045329 829221 111575 88% /users/staff


commandes de comparaison de fichiers


diff, diff3 , sdiff, cmp


cmp file1 file2

comparaison caractères par caractères de deux fichiers


diff file1 file2 (dir 1 dir2)

diff genere sur la sortie standard une liste d'instructions ed

qui permette de transformer le fichier file1 en file2

n1 a n3,n4 (ajouter les ligne n3 à n4 en position n1)

n1,n2 d n3 (détruire les lignes n1,n2 )

n1,n2 c n3,n4 (changer les lignes n1,n2 en les lignes n3,n4)

après chacune de ces commandes sont écrites les lignes affectée de chaque fichiers qui sont impliquées < pour file1 et > pour file2


du résume l'utilisation du disque

-a affiche tous les fichiers hérachiquement avec les catalogues en indiquant pour chaque objet la place utilisé.

-s (silencieusement) juste un résume global pour chaque catalogue indiqué (. par défaut).


find références [expressions]

find recherche récursivement dans les catalogues donnés en argument les fichiers vérifiants l'expression booléen écrite avec les primitives suivantes :


 -name regexp vrai si le nom du fichier vérifie

-perm mode (mÞmes arguments que chmod )

mode octal vrai si les droits sont exactement mode

-type char vrai si

char = f file

d ctalogue, b fichier spécial bloc, c caractère spécial bloc, p FIFO, s socket etc ¼

-user username

-group gname

-nouser vrai si utilisateur inconnu

-print affiche la référence toujours vrai

-exec commande

vrai si la valeur de retour dans le shell est nulle

la fin de la commande doit Þtre matérialisé par \;

on peut introduire le nom du fichier dans la commande

par {}.

-ok cmd mÞme chose que exec mais avec confirmation de l'utilisateur

-atime n vrai si l'on a accéder au fichier dans les n dernier jours

exemples:

effacer tous les fichiers a.out et les fichiers d'extention .o auquel on n'a pas fait d'accès depuis une semaine:


find / \( -name a.out -o -name '*.o' \) -atime +7 -exec rm {} \;






env [name = value] ¼ [command [arguments ¼]]

positionner des variables d'environnement pour une commande

sans paramètre affichage

exemple: env TERM=vt100;


expr evaluation d'expressions

ex: expr 3 \* 4

12


file détermine le type des fichier

peu fiable.


fsck file systeme check commande de réparation d'un disque abimé lors d'un crah du système


grep rechercher des motifs dans un fichier


kill -signal PID envoyer un signal à un processus


killall tue tout les processus, permet de préparer l'arrÞt de la machine


ld éditeur de liens


lex analyseur lexical


line compteur de ligne


lint correcteur de C


ln création de liens (éventuellement de liens symbolique comme pour les catalogues)


logname nom de l'utilisateur


lp envoi d'un fichier a l'imprimante


ls listage des catalogues


mail, mailx, elm utilitaires de courrier


make fonction de maintenance mise a jour d'exécutables de programmes


mesg manipulation des droits d'accès au terminal courant


mkdir création de catalogue


more, pg affichage ergonomique de fichiers


mv mvdir changement de référence d'un fichier ou d'un catalogue


newgrp changement de groupe réel


news les nouvelles


nice -nn commande

diminue la priorité de commande


nl [file]

numéroteur de lignes

tsort

tri topologique

nohup

protection contre le signal 1 SIGTERM

nroff troff ++

commande de mise en page (beurk).


od [-bcdosx] file

dump octal, decimal d'un fichier

pack,unpack,pcat

compression décompression, affichage d'un fichier compressé (algorithme Huffman).


passwd , yppasswd

Changer de mot de passe.

pr

filtre de mise en page pour l'imprimente

prof

outil de mise au point de programmes

ps [-delafw]

Etat des processus

pwd

affichage du répertoire de travail.

rm [-iR] ref

destruction d'une référence

rmdir ref

destruction d'un répertoire

sed [-e "expression"] [files ¼]

[-f fichier_d'expression] [files¼]

éditeur de flux

a utiliser avec les expression rationelles.


size file

taille des différents composant d'un exécutable.

sleep n

Attente en sommeil de n secondes


sort [options] [[+deb -fin]*] [références...] [-o sortie]


Tri des fichiers référencés envoyer sur la sortie standard ou dans le fichier sortie

Le tri par défault est un tri lexicographique sur l'ensembles des lignes des fichiers.

options: -n tri numérique

-b les blanc en début de champ sont ignorés

-tx utilise x comme séparateur de champ

+deb -fin limite les comparaisons au champs décrits


exemple:

sort +1r -2 +5n -6 fic

tri sur le 2ième en lexicographique inverse

puis en numérique sur le 6iéme


spell

correcteur orthographique (en anglais)

split [-l NN] [-b NN] [file [nom]]

découpe un fichier en plusieurs fichiers

-l NN NN lignes par fichiers

-b NN

En fichiers de NN octets

si NN = nnk de n kiloOctets

si NN = nnm de n MégaOctets

Les fichiers on pour référence soit

aaa,aab,aac,¼

Soit

motaaa,motaab,motaac,¼



strip (cc -s )

retire la table des symbol d'un binaire équivalent à l'option -s du compilateur (ceci permet de prendre moins de place sur disque!).

stty

manipulation de la ligne terminal<->machine

su utilisateur

Permet de changer de uid effective

sync

assure la syncronisation des disques.

tail -nn ref

head -nn ref

filtre qui permet de prendre la fin ou le debut d'un fichier.

tar [-xcvf] [archive] [ref¼]

archiveur pour lecteur de bande utilisable sur disque dur. Cette commande permet de transformer une arborescence en un seul fichier pour un transport plus agréable.

-v verbose

-xf [archive] fichiers¼

eXtraction des fichiers de l'archive

-cf [archive] fichiers¼

Création d'une archive avec les fichiers.

Si l'option -f n'est pas utilisée c'est le lecteur de bande qui est utilisé comme archive.

Pour utiliser tar comme un filtre on utilise "-" comme nom d'archive.


tee [ref]

filtre simple qui sauvegarde une comme de ce qui est écrit sur la sortie standard dans le fichiers ref. ex: com | tee resultat , permet de voire les resultats à l'écran tous en les sauvegardant dans le fichier resultat.


time commande

Donne le temps d'exécution de la commande

touch ref ¼

change la date de dernière modification du fichier "touché".

tr[-cds] ch1 ch2

filtre qui converti les caractère de ch1 en caractères de ch2, un ensemble de couples.


tty

référence du terminal


uname

nom du système


uniq file

donne les lignes répétées d'un fichier.


wall

write à tous les utilisateurs logés.


wc [-lcw] files

filtre qui compte ligne mot et caractères.


who

liste des utilisateur logés.


write utilisateur

envoi de message sur un terminal



vi éditeur vidéo


éditeur pleine page


vi

vi filename

vi +nn filename saut jusqu'à la ligne nn

vi +/regexp filename saut jusqu'à la première ligne contenant regexp



Tampon temporaire


Le travail d'édition sur le tampon n'est validé qu'après une commande d'écriture :w (write)


Les modes de vi


- mode déplacement

- mode insertion/édition

- mode commande


Le mode déplacement est le mode standard oò l'entrée est bufferisée par caractères.


Le mode insertion n'est pas bufferisé et doit Þtre terminé par le caractère <Esc> .


Le mode commande est bufferisé en ligne.




Le mode déplacement


les touches hjkl et les flèches permettent de déplacer le curseur dans le tampon.


<return> fait passer à la ligne suivante

^f (^u) une page en avant (en arrière)

<n>G saut sur la nième ligne par défaut en fin de fichier


les touches suivantes ont aussi des effets :

^N ^P + - $ | ^U ^D ^B H M L


Recherche de motif

<n>f<car> recherche sur la fin de la ligne la nième occurence du caractère (F dans le début de la ligne) et positionne le curseur dessus.

<n>t<car> idem mais le curseur est sur la lettre précédente

<n>T<car>


; répéter la dernière commande fFtT

, dans le sens inverse



<n>/motif/<return> recherche dans la suite du tampon la première occurence du motif

<n>?motif?<return> en remontant dans le tampon.


n répétition de la dernière recherche de type /.../

N ?...?


Le mode insertion


Toutes les insertions de chaine doivent Þtre terminées par le caractère <Esc>


a<chaine> immédiatement après le curseur

i<chaine> immédiatement avant le curseur

A<chaine> en fin de ligne

I<chaine> en début de ligne

o<chaine> insère la chaine dans une nouvelle ligne crée sous la ligne courante

O<chaine> idem dans une ligne au dessus

en mode insertion

^H ou <touche_effacement> supression du caractère précédent.

^V permet d'insérer les caractères spéciaux, exemple: ^H




Commandes de suppression de texte


<n>x ou <n>d<espace> supprime le caractère sous le curseur

<n>X idem avant le curseur

D supprime la fin de ligne à partir du curseur

<n>dw supprime le mot

<n>dd supprime la ligne










Modification de texte


r<car> remplacement du caractère sous le curseur

R<chaine><Esc> remplace le caractère par la chaine

<n>s<chaine><Esc> remplacer n caractères par la chaine

<n>S<chaine><Esc> remplacer n lignes par la chaine

C<chaine><Esc> remplacer la fin de ligne par la chaine

<n>cw<chaine><Esc> remplace le mot par la chaine

<n>cc<chaine><Esc> remplace les n lignes par la chaine



<n>J joint la ligne et le suivante


Les tampons (copier,coller)


26 tampon nommés a-z

"<lettre><n>yw copier 1 ou n mots dans le tampon

"<lettre><n>yy

"<lettre><n>Y copier la ligne courante (n lignes)

"<lettre>p coller le tampon après la ligne courante

"<lettre>P coller le tampon avant la ligne courante



Recherche

/regexp/ recherche de l'expression rationnelle vers l'avant

?regexp? recherche de l'expression rationnelle en remontant dans le fichier.


:n se placer sur la ligne n

Mode commande


:w sauvegarder le tampon sur disque

:w filename sauvegarder le tampon dans le fichier filename sur disque

ZZ ou :wq sauvegarder et quitter

:q quitter

:q! quitter sans sauvegarder

:e recharger le tampon a partir du disque

:e filename éditer le fichier filename

:!<commandeshell>

lancer une commande shell


Utilisation de commande ed/sed sous vi


[.,.] indique un intervalle de lignes sur lequelles effectuer la commande par defaut la valeur est la ligne "." (ligne courrante),

$ désigne la dernier ligne du fichier.


déplacement

: [.,.] m . déplace les lignes à la ligne indiquée.

: [.,.] t . recopie les lignes après la ligne indiqué

impression

: [.,.]p visualisation des lignes

: [.,.] l avec affichage des caractères non imprimables.

supression

:[.,.]d suppresion des lignes de l'intervalle.

substitution

: [.,.]s/expressionrationelle/motif/

oò motif peut contenir

& motif satisfaisant l'expression

\n nième champ de l'expression

% dernier motif de remplacement utilisé.

: [.,.]s/expressionrationelle/motif/g sur toute la ligne.

Expressions Rationnelles (vi,sed,emacs)

1. Tous les caractères saus les caractères spéciaux se correspondent. Les caractères spéciaux sont les "délimiteur" de l'expression plus \[. et parfois ^$*.


2. Un . correspond à n'importe quel caractère.

3. Un \ suivie par un caractère (suaf un chiffre ou ( et ) ) correspond avec le caractère.


4. Une chaine s non-vide entre crochets [s] (ou [^s]) correspond (ne correspond pas ) à n'importe qeul caractère de la chaine. Dans s, \ n'est pas un caractères spécial, et ] ne peut apparaitre que comme premier caractère. Une sous-chaine a-b avec a inférieur à b dans l'ordre ASCII correspond a l'interval inclusif de a à b.


5. Une expression de la forme 1-4 suivie de * correspond a une suite de 0 ou plus de correpondances de l'expression.


6. Une expression x de la forme 1-8 entre \(x\) correspond au mÞmes mots que x. Une expression de la forme 6 est appellé un champ.


7. Un \ suivie d'un chiffre n correspond a une copie exacte du mot qui a correspondu au n ième champs (forme 6).


8. Concaténation. Une expression x de forme 1-8, suivie d'une expression y de la forme 1-7 , correspond a une mot correspondant à x suivie d'un mot correspondant à y. Avec la correspondance de x etant la plus longue correspondance compatible avec une correspondance de y.


9. Une expression forme 1-8 précédée d'un ^ (suivie d'un $) doit correspondre à un début (une fin) de ligne. (ex: ^$ est une ligne vide).


10. Les expression définie par 1-9 séléctionne toujour la plus long correspondance en partant de la gauche (début de ligne).


11. Une expression régulière vide correspond à la dernière expression régulière utilisée.

Exemples


Afficher tous les fichiers du catalogue de travail

qui sont des fichier standard,

qui sont ouvert en ecriture pour le proprietaire

qui sont ouverts en lecture pour les menbres du groupe

dont le nom se termine par le caractere c


ls -l|grep '^-.w.r.*c$'



Afficher les couples nom d'utilisateur informations du fichier /etc/passwd, ce fichier est organisé comme suit :

logname:passwd:uid:gid:infos:home:shell


sed -e "s/^\([^:]*\):[^:]*:[^:]*:[^:]*:\([^:]*\):.*$/\1 \2/" /etc/passwd


¼

prof Compte prof pour DR,,,

andrieux Baba au Rhum,Noisy,0000,0000

ano ano,,,

banomyon banomyon,,,

behar behar,,,

bisot bisot,,,

brauda brauda,,,

chum chum,,,

deluca deluca,,,

fivaz fivaz,,4932,6026254

¼


Sous vi remplacer le mot sdtin pat stdin :

: 1,$s/sdtin/stdin/g

les shells 22 Stage