1 Jour 1 : cours UNIX/Linux :

Transcription

1 Jour 1 : cours UNIX/Linux :
1
Jour 1 : cours UNIX/Linux :
Les systèmes d’exploitation SE (Operating System : OS) comme linux, macosX ou windows permettent la
gestion du matériel (communication via des appels système avec le processeur, la mémoire, les périphériques,
d’entrée/sortie) et la gestion des ressources (système multi-utilisateurs et multi-tâches, système de fichiers).
Le système UNIX est un système multi-utilisateurs et multi-tâches créé en 1969. Il a donné naissance à
différents systèmes de type UNIX comme macosX ou linux pour PC et pour des stations de travail IRIX pour
Silicon Graphics, Solaris pour SUN, etc. . . Pour les PC sous windows, il existe également un émulateur UNIX,
cygwin, qui permet d’avoir un UNIX sans avoir à partitionner le disque ni redémarrer la machine pour passer
de Windows à UNIX.
Différentes distribution Linux sont disponibles (Ubuntu, Mandriva, Suse. . .) gratuitement (GNU/Linux) ou
pas. Ces distribution ont toutes le noyau linux (kernel) écrit en C + des logiciels configurés autour de ce système
(outils GNU, système de fenêtrage, environnements graphiques Gnome, KDE. . .).
Le shell est un interpréteur de commande en mode texte qui est chargé de faire l’intermédiaire entre l’utilisateur et le SE. Il peut s’utiliser en mode interactif (jour 1 et 2) ou pour exécuter des commandes écrites dans
le langage de programmation du shell (sh, csh, bash, jour 3 et 4). L’interpréteur de commande est un processus
lancé lorsqu’on lance un terminal. Il interprète la signification de la ligne tapée par l’utilisateur, effectue des
requêtes au système et retourne le résultat. Il en existe plusieurs : sh (Bourne shell), bash (Bourne Again shell),
csh (C shell), tsch (Telnex C shell, , amélioration de csh avec notamment la complétion et l’édition de ligne
de commande ). . .Tous les shell ne sont pas forcément installés par défaut quand on installe une distribution
linux (case à cocher pour installer tcsh éventuellement). Il y a un shell par défaut pour les utilisateurs qui peut
être modifié (édition du fichier /etc/passwd ou préférences de l’application Terminal de macosX ou commande
chsh). On peut également changer de shell en tapant le nom du shell souhaité dans le terminal (exit pour quitter
ce shell). Nous allons travailler avec bash.
1.1
Les utilisateurs
Chaque utilisateur d’un système UNIX a besoin pour travailler d’un compte sur la machine. Chaque compte
est identifié par un nom d’accès ou login. A chaque login est associé un mot de passe qui sécurise l’accès au
système, un numéro d’utilisateur (UID), un emplacement sur le disque dur où l’utilisateur pourra stocker ses
fichiers (home directory) et un groupe d’utilisateurs. Il faut être administrateur sur la machine pour pouvoir
créer de nouveaux utilisateurs. Les utilisateurs sont soit définis localement (/etc/passwd) soit via un annuaire
partagé en réseau (NIS par exemple). Chaque fichier et chaque processus appartiennent à un utilisateur et un
groupe. Il existe un utilisateur particulier (root) qui correspond à un super-utilisateur qui possède tous les droits.
1.2
Les fichiers
Sous UNIX, tout est fichier. Tout ce qui permet de manipuler des données (flots d’octets) est fichier sous
UNIX : les fichiers ordinaires, les répertoires et les fichiers spéciaux (périphériques, les liens).
L’ensemble des fichiers d’un système UNIX est rangé dans un arbre. La racine de cet arbre est constituée d’un
répertoire nommé ’/’. Ce répertoire contient plusieurs répertoires, qui sont les branches maîtresses de l’arbre,
et quelques fichiers. Chacun de ces répertoires contient éventuellement d’autres répertoires et des fichiers, et
ainsi de suite. Parmi les répertoires présents dans la racine (/), certains sont retrouvés dans presque tous les
systèmes UNIX et contiennent à peu près toujours la même chose : etc contient des fichiers de paramètres
du système, var contient des informations sur le fonctionnement du système, bin contient les programmes de
base du système, usr contient une grosse partie du système, home contient les répertoires alloués a chaque
utilisateur, le répertoire local généralement situé dans le répertoire usr contient l’ensemble des programmes
spécifiques à une machine, etc.
UNIX est un système multi-utilisateur. Afin que les données de chacun soient à l’abri des autres utilisateurs,
chaque fichier appartient à un utilisateur précis (en général son créateur) et à un groupe d’utilisateurs. De plus,
à chaque fichier est attribué un ensemble de droits d’accès qui concernent :
– le propriétaire du fichier,
– le groupe à qui appartient le fichier,
– l’ensemble des utilisateurs de la machine.
Pour chacune de ces trois catégories correspond un droit de lecture, d’écriture et d’exécution.
– Le droit de lecture donne le droit de lire le fichier.
– Le droit d’écriture de le modifier, ou de l’effacer.
– Le droit d’exécution permet d’exécuter le fichier si celui-ci contient un programme. Le droit d’exécution
donné à un répertoire indique que l’on a le droit de le parcourir.
Ainsi, le plus souvent le propriétaire du fichier a les droits de lecture et d’écriture, voire au besoin d’exécution,
alors que le groupe à juste un droit de lecture et éventuellement d’exécution, ce qui permet de partager son
travail au sein d’une équipe. Enfin le reste des utilisateurs a soit des droits similaires au groupe soit aucun droit.
Ces droits peuvent être modifiés par le propriétaire du fichier grâce à la commande chmod.
Le nom + la localisation dans l’arborescence (path, chemin) d’un fichier permettent d’identifier un fichier.
Ainsi, deux fichiers peuvent porter le même nom et correspondre à deux fichiers différents si ils se situent bien
à des endroits différents dans l’arborescence. Pour le nom, le seul caractère interdit est ’/’ mais mieux vaut se
limiter aux lettres de l’alphabet (minuscules et majuscules), aux chiffres et _. En UNIX les majuscules et les
minuscules sont des caractères différents à part entière, aussi les noms TOTO, toto, Toto et ToTo sont tous
différents. Les noms de fichiers commençant par le signe ’.’ sont des fichiers cachés et correspondent le plus
souvent à des fichiers de configuration.
La dénomination d’un fichier peut contenir les indications sur la localisation de celui-ci dans l’arborescence.
Dans ce cas, le nom du fichier est précédé du chemin qui mène à lui. Chaque étape du chemin est séparée par
le signe ’/’. exemple : /etc/passwd indique le fichier passwd localisé dans le répertoire etc
– si le chemin commence, par un signe ’/’ :
– le chemin est dit absolu et le premier élément de celui-ci se trouve dans le répertoire racine. Dans l’exemple
ci-dessus, le répertoire etc est effectivement placé dans le répertoire racine.
– si le chemin ne commence pas par le signe ’/’ :
– Le chemin est dit relatif et le premier élément du chemin se trouve dans le répertoire courant (répertoire
d’où est lancée la commande qui utilise le nom de fichier).
– si le chemin commence par le signe ’∼’ :
– Le chemin est relatif à la maison de la personne exécutant la commande ou à la maison de l’utilisateur dont
le login figure juste après le ∼. Par exemple, l’utilisateur grincheu, a sa maison en /home/people/stage/grincheu,
pour cet utilisateur le fichier ∼/toto/tutu fera référence au fichier tutu localisé dans le répertoire
/home/people/stage/grincheu/toto. Un autre utilisateur pourra faire référence à ce même fichier en
tapant ∼grincheu/toto/tutu.
– le signe ’.’ dans le chemin indique le répertoire courant.
– le signe ’..’ dans le chemin indique le répertoire au-dessus.
1.3
Les processus (commande, application)
On peut définir rapidement un processus comme étant un ensemble de commandes travaillant sur un ensemble
de données. Chaque fois que vous lancez l’exécution d’un programme, un processus est créé avec l’ensemble des
instructions du programmes et une zone mémoire servant au stockage des données utiles au programme. Si
vous ou un autre utilisateur lance le même programme (ou un autre) un nouveau processus est créé et les deux
processus s’exécuteront indépendamment l’un de l’autre, en parallèle. A la fin de l’exécution du programme, le
processus est détruit et la place occupée en mémoire par celui-ci est libérée. Certains programmes peuvent provoquer lors de leur exécution la création de plusieurs processus afin d’effectuer plusieurs tâches simultanément.
Chaque processus est identifié par un numéro unique le PID. Toute action sur un processus se fait grâce à
l’indication de ce numéro.
Comme un fichiers, un processus a un utilisateur et un groupe propriétaires (UID, GID). Ils sont définis lors
du lancement du programme et correspondent généralement à la personne ayant lancé exécution du programme.
Ces valeurs déterminent les droits à un processus d’accéder à telle ou telle ressource de la machine et
particulièrement aux fichiers. Ainsi, un processus créé par un utilisateur n’aura le droit d’accéder au fichier que
suivant les droits correspondants à cet utilisateur.
De plus, le propriétaire d’un processus a le droit d’en arrêter l’exécution (root aussi).
Lors de l’exécution d’une commande, un processus est créé. Celui-ci va alors ouvrir trois flux :
– stdin, appelé entrée standard, dans lequel le processus va lire les données d’entrée. Par défaut, stdin
correspond au clavier ;
– stdout, appelé sortie standard, dans lequel le processus va écrire les données de sortie (le résultat de la
commande).
Par défaut, stdout correspond à l’écran ; stderr, appelé erreur standard, dans lequel le processus va écrire
les messages d’erreur. Par défaut, stderr correspond à l’écran.
Par défaut, lorsque l’on exécute une commande, les données sont donc lues à partir du clavier et sa sortie
et ses erreurs s’affichent sur l’écran, mais il est possible de lire les données à partir d’un fichier et d’envoyer la
sortie sur un fichier ou vers une autre commande, ... grâce aux redirections.
1.4
Les commandes UNIX de base
Syntaxe générale : commande [-options] [arguments]
pwd, ls [-sFla], cd, mkdir, cp [-r], mv, rm [-i], rmdir, cat, more, less, man, touch, echo,
ps, kill.
La commande man.
1.5
Redirection des entrées-sortie :
1.5.1
Redirections
bash
effet de la redirection
<
l’entrée standard est lu à partir d’un fichier
> ou 1>
La sortie standard est redirigée dans un fichier (RAZ du fichier)
>> ou 1 >>
La sortie standard est redirigée dans un fichier (concaténation à la
fin du fichier si il existe)
La sortie standard et les erreurs sont redirigées dans un fichier (RAZ
du fichier)
2>
Les erreurs sont redirigées dans un fichier (RAZ du fichier)
La sortie standard et les erreurs sont redirigées dans un fichier(concaténation)
Les erreurs sont redirigées dans un fichier(concaténation)
2 >>
1.5.2
Les pipes
proc1 |
équivaut
proc1 >
proc2 <
1.6
proc2
à
fichier
fichier
Les variables du shell et les variables d’environnement
On écrit en général les variables locales au shell courant en minuscules. Elles sont définies par var=<value>
en bash, et par la commande set var=<value> en csh ou tcsh. Les variables d’environnement héritées par les
shell et les processus fils sont écrites en majuscules et définies avec setenv en csh et export en bash .
Le contenu d’une variable est $var. Pour afficher le contenu d’une variable, il faut faire : echo $var
bash
contenu de la variable d’environnement
PWD
le chemin du répertoire courant
USER
login de l’utilisteur
TERM
type de terminal (fenêtre du shell)
HOME
le home directory
PATH
chemins de recherche pour l’exécution des commandes
SHELL
indique le shell courant
PS1
contenu du prompt
HISTSIZE
nombre de commandes gardées en mémoire et restituées par la commande history
TMOUT
temps de déconnexion automatique d’un shell (en seconde en bash,
en minutes en tcsh)
Affiche la liste des choix lorsque la complétion échoue (toujours le cas
dans bash)
1.7
*, @
1, 2, . . .
#
les arguments de la ligne de commande
(numérotées à partir de 1)
le nombre d’arguments
?
statut de la dernière commande exécutée (0 si elle s’est bien exécutée)
Communication :
ftp, ssh, scp : notion de client/serveur
1.8
Autres commandes UNIX
who, (e)grep [-v], wc [-lcw], head [-number],
tail [+ ou – number], tr s1 s2 [-d], tr -d
n < res,
tr ’
n’ ’ ’ < res, sort [-nr], ln [-s], tee pour écrire dans un fichier et sur la sortie standard, history, rappel
de la commande précédente avec !!, !n, !debut-de-mot, file (ascii (text), pictures, compressed data, etc), df,
du, gzip, tar.
1.9
Métacaractères UNIX
(’*’,’ ?’,’[a-z]’) : différences avec les expressions régulières (ces méta-caractères ne spécifient que les noms de
fichiers existants). Neutralisation des méta-caractères ou des espaces (les quotes simples ’ ou l’antislash \).
Génération des noms de fichiers :
* n’importe quelle chaîne de caractères
? n’importe quel caractère
[ ... ] l’intervalle décrit entre les crochets
1.10
TP :
11h-17 h :
Commandes de base : pwd, ls, cd, cat, mkdir, cp, mv, rm, man, touch, echo. Les options (ls -sFl, rm -i).
Les métacaractères du shell ls t*, ls t?to, ls [tp]*, tester avec ls la neutralisation des métacaractères
(cf. section 1.9).
ls -l voir les permissions, les changer (chmod, test de modification d’un dossier système protégé). Examen de la hiérarchie, création/délétion de répertoires et de fichiers. Utilisation de la complétion (sous tcsh
set autolist).
Le login
bash :
Lors d’un login interactif (c’est-à-dire qu’on entre des commandes, pas dans un script écrit), les fichiers
d’initialisation lus sont :
/etc/profile
~/.bash_profile, ~/.bash_login ou ~/.profile (le premier des trois lisibles est lu/exécuté)
~/.bash_logout lors du logout.
Lu lors de l’invocation de shell non interactifs (par exemple, scripts) ou lors du lancement d’un nouveau
shell :
$\sim$/.bashrc
Editeur de texte : nedit (différence avec traitement de texte). Lancer ou non en tâche de fond (processus
père, fils). Notions de processus : ps (voir les fils), ps -A (voir tous les process, en fait, à vérifier sur votre
machine, car le ps peut avoir un comportement différent au niveau option selon le système).
Edition du .profile. Création d’un alias : alias ll="ls -l".
Compression de fichier : compress, uncompress. (uncompress GMG.pep.Z), gzip (.gz)
1.10.1
Récupérer un fichier de séquences
1. Réseau : ftp sur ftp.pasteur.fr (nom : ftp ou anonymous, passwd : <votre email>). Aller dans pub/ regarder
les donnnées. Se mettre en binary (différence avec ASCII). Ramener un fichier de séquences si possible
(yeast) (sortie de ftp avec bye). Lien complet sur les dossiers de séquence des chromosomes de la levure :
ftp://ftp.pasteur.fr/pub/databases/yeast/archive/sequences/
Sinon, se connecter sur le ncbi via le web, et ramener un génome de bactérie (mycoplasma pneumoniae,
par exemple).
2. sur le net, sur http ://abiens.snv.jussieu.fr/OBI/OBI1/TP, récupérer le fichier GMG.pep
1.10.2
Utilisation de grep, egrep.
Sortir les titres du fichier de séquence (si fasta, egrep ">" fichier.fst). word Count (wc). Compter les
séquences. (egrep ">" fichier.fst | wc -l). Trier en ordre inverse (egrep ">" fichier.fst | sort -r).
Redirection : création d’un fichier des titres : (egrep ">" fichier.fst > fichier.names).
1.10.3
find
find, un outil puissant
/ -name bin -print find
/ -type f -name bin -print find
/ -type d -name bin -print
nestor$touch reste1 reste2 reste3 reste4
nestor$ ls reste*
reste1 reste2 reste3 reste4
nestor$ find . -name reste* -print
find: reste2: unknown option
nestor$ find . -name reste\* -print
./reste1
./reste2
./reste3
./reste3
nestor$ find . -name "reste*" -print
...
nestor$ find . -name ’reste*’ -print
...
nestor$ find / -name "reste*" -exec rm {} \; -print
1.10.4
Installation de wget
Aller chercher les sources du programme sur : http://ftp.gnu.org/gnu/wget/, (prendre latest ou la dernière version).
Extraire par tar xzvf wget-latest.tar.gz (explication du tar et de ses options)
Lire le README et le INSTALL,
Ensuite :
./configure --prefix=\$HOME
./make
./make install
Aller chercher le fichier nucleolar-IPI-719.txt sur le site http://abiens.snv.jussieu.fr/OBI/OBI1/TP.
Il contient des identifiants de la banque IPI (IPI International Protein Index)
http://www.ebi.ac.uk/cgi-bin/dbfetch?db=IPI&id=IPI00000001&format=fasta
Vu que la séquence contient des "scories" html, il faudra filtrer ce qui est séquence FASTA de ce qui est
html avec egrep.
2
Jour 2 - Programmation système Unix (sous csh, tcsh, quelques
différences avec le sh ou bash) :
Différence entre programmes compilés (s’adresse directement au processeur dans sa "langue", ex :cc), et
interprétés (interprété par le shell ou interpréteur (awk,perl) puis executé).
variables (alphanumériques, numériques), tableaux.
Programmation de scripts C-shell
L’exécution d’un script en shell (bash et tcsh)
bash nom_fichier
ou rendre le fichier exécutable (chmod u+x nom_fichier) puis taper le nom du fichier
Pour forcer l’exécution du fichier en C Shell, le fichier doit commencer par # !/bin/bash
bash -n nom_fichier
interprète les commandes sans les exécuter
bash -v nom_fichier
imprime les lignes comme elles sont lues
bash -x nom_fichier
imprime les lignes comme elles sont interprétées
désactive la génération de nom de fichiers en utilisant les métacaractères
bash -f nom_fichier
on peut mettre les options dans le shell courant avec set :
set -f set -o noglob empêche la génération de nom de fichiers en utilisant les métacaractères (dans ce
cas, rm * retirera un fichier * et pas tout ce qui se trouve dans le dossier courant).
set -v set -o verbose Prints shell input lines as they are read.
set -x set -o xtrace Print command traces before executing command.
echo $- permet de voir les options avec lequel le shell a été lancé.
Les variables
Un nom de variable ne peut commencer par un symbole numérique.
bash
tcsh
action
variable=valeur
set variable valeur
affectation (BASH : ATTENTION :PAS DE BLANCS)
$variable
$variable
valeur de la variable
${variable}
${variable}
valeur de la variable
$ ?variable
Renvoie 0 si la variable n’est pas initialisée, 1 sinon
Les opérateurs arithmétiques
En bash : ((EXPRESSION)) effectue une opération arithmétique.
La commande (( ))} évalue une expression arithmétique et donne un statut de sortie à 1 si l’expressi
permet également d’exécuter une ou plusieurs expressions arithmétiques. Elle est généralement utilisé pour assigner des valeurs aux variables de calcul.
Exemple :
a=$((1+2)) met la valeur 3 dans a
c=$((b=7+2)) met la valeur 9 dans b et le résultat dans c
La commande : let x=2 y=2**3 z=y*3;echo $? $x $y $z
donne le résultat suivant : 0 2 8 24
Si un nombre commence par 0x il sera traité comme un hexadécimal.
En tcsh, @var = exp assigne une valeur à une variable numérique
On peut aussi utiliser la syntaxe $[[EXPRESSION]] pour faire des tests plus naturel sur les chaînes de
caractères et les noms de fichier, et on peut combiner les tests, par exemple :
[[ ( -d "$HOME" ) && ( -w "$HOME" ) ]] && echo "home is a writable directory"
opérateurs
() , + , - , * , /
opérations arithmétiques classiques
%
reste
ˆ
ou exclusif bit à bit
˜
complément unaire
**
opérateur d’exponentiation
VAR++
post incrémentation
++VAR
pré incrémentation
VAR--
post décrémentation
--VAR
pré décrémentation
Les opérateurs booléens
==
comparaison
!=
diffèrent de
!
> ,<
,<=
>>
,>=
négation
comparaison
décalage à droite Exemple : @ a = ( $b >> 1 )
<<
décalage à gauche Exemple : @ a = ( $b << 1 )
&
Et bit à bit
|
Ou bit à bit
&&
Et logique
||
Ou logique
Les opérateurs d’affectation
=
affectation
+=
-=
x+=y équivaut à x = x + y
*=
x*=y équivaut à x = x * y
/=
x/=y équivaut à x = x / y
%=
x%=y équivaut à x = x % y
ˆ=
xˆ=y équivaut à x = x ˆ y
++
--
x++ équivaut à x = x + 1
x-=y équivaut à x = x - y
x-- équivaut à x = x - 1
Attention, les opération suivantes ne marchent pas : &=, |=,<<=,>>=
Arguments des scripts.
fonction exit (retourne le "status").
valeur de retour de la dernière commande :
bash : variable $ ? csh : variable "status"
export (bash) : pour transmettre une variable à un shell bash fils
export mavariable
(en csh : setenv permet de mettre une variable d’environnement qui sera héritée par les processus fils)
récupération des paramètres dans la ligne de commande
bash
tcsh
résultat
$#
$#
$n
ou
$argv[n]
indique le nombre d’arguments donnés au script
$n
équivaut à $argv[n] mais ne sortira jamais d’erreur out of range
$*
$*
$?
$?
liste des paramètres (en tcsh : équivaut à $argv)
a pour valeur le code de retour de la dernière commande exécutée dans le
shell
Quelques variables spéciales
bash
tcsh
read var
set var=$<
$$
$$
remplacé par la prochaine entrée courante (pour écrire des scripts
interactifs)
le numéro de processus du shell courant
Les caractères spéciaux
\
banalise le caractère suivant
"..."
banalise les caractères sauf \ , $ et `
’...’
banalise tous les caractères
`commande`
substitution de commande (bash : on peut utiliser $(commande)
préfixe pour les numéro de job (le numéro de job est indiqué lors du lancement d’une commande en background) Pour visualiser la liste des jobs : jobs
% num
echo a{b,c,d}e imprime à l’écran : abe ace ade
Les deux ordres suivant permettent d’imprimer le contenu de la variable a à l’écran :
echo $a
printf "$a\n"
2.0.5
variables alphanumériques (string) :
a="/usr/people/toto.txt"
echo ${a%.*} donne /usr/people/toto (sans extension)
la dernière occurence dans la variable $a du caractère qui suit le % donne le premier caractère de la suite
qui sera omise
echo ${a%o*} donne /usr/people/tot (et non pas /usr/people/t )
echo ${a#*/} remplace le préfixe le plus petit finissant par ’/’ par rien, donc donne usr/people/toto.txt
(note : echo ${a#/} aurait donné la même chose)
echo ${a##*/} remplace le préfixe le plus long finissant par ’/’ par rien donc donne toto.txt
(note : echo ${a#/usr/people/} aurait donné la même chose)
la dernière occurence dans la variable $a du caractère qui suit le % donne le premier caractère de la suite
qui sera omise
echo ${a:offset:length} donne la chaîne a de la position offset sur la longueur length (note : les string
commencent à zéro)
echo ${a:5} donne people/toto.txt (les string commencent à zéro)
echo ${a:5:6} donne people
echo ${a/toto/titi} donne /usr/people/titi.txt
echo ${a/t/v} donne /usr/people/viti.txt (remplacement 1ère occurrence)
echo ${a//t/v} donne /usr/people/vivi.txt (remplacement partout)
Mettre le résultat à l’écran d’une commande dans une variable (quotes d’exécution `` : `<commande>`) :
donne un ensemble (liste). Attention à la limitation du nombre d’éléments dans une liste (256 ?).
tableaux (listes), indices :
a = ( a b c d ) # on met une liste d’éléments dans la variable a
echo ${a[*]} donne tous les éléments du tableau a
En bash, echo ${a[0]} donne le 1er élément du tableau a
echo ${a[1]} donne le 2eme élément du tableau a
En bash, ${#a} donne le nombre de caractères d’une variable chaîne de caractère a
Le résultat d’une commande lancée par les quotes inverses donne une telle liste :
a=‘ls‘
echo $a[0];
2.0.6
Tests et boucles :
if : if TEST-COMMANDS; then COMMANDS; elif AUTRES-COMMANDES; else ENCORE-COMMANDES; fi
Tests :
D’abord : test expr} et [expr ] sont équivalents.
[ -a monfichier ] Vrai si monfichier existe
[ ! EXPR ] Vrai if EXPR est faux
[ EXPR1 -a EXPR2 ] a pour valeur EXPR1 et EXPR2
[ EXPR1 -o EXPR2 ] a pour valeur EXPR1 ou EXPR2
On peut comparer des valeurs arithmétiques en utilisant un des opérateurs suivants : -eq,-ne,-lt,-le,-gt, -ge,
ce qui signifie égal, différent, inférieur, inférieur ou égal, supérieur à, supérieur ou égal, respectivement.
On peut comparer des chaînes de caractères quand à leur égalité, inégalité, ou leur ordre alphabétique en
utilisant les opérateurs =, ! =, <, > respectivement. L’opérateur unaire -z}teste si une chaîne est vide,
tandis que -n}ou pas d’opérateur renvoie vrai si la chaîne n’est pas vide.
ıRemarque : attention les opérateurs <}et >}sont également utilisés par le shell pour la redirection, vous
devez donc leur enlever leur qualité de métacaractère par \< ou \>.
-d
-e
est un répertoire
-f
est un fichier régulier
-h
-p
est un lien symbolique (-L marche aussi)
-r
est lisible par vous
-w
est modifiable par vous
-s
est non vide
-S
est un socket
-N
a été modifié depuis la dernière lecture
existe (également-a)
est un pipe nommé
En plus des essais unaires ci-dessus, vous pouvez comparer deux fichiers avec les opérateurs binaires indiquées
ci-dessous
Test de paires de fichiers
-ot
Vrai si
Teste si fichier1 est plus récent que le fichier 2. La date
de modification est utilisé pour cela et la comparaison
suivante.
Teste si fichier1 est plus ancien que le fichier 2.
-ef
Teste si fichier1 est un lien dur vers fichier2.
-nt
boucles :
bash
csh
for i in <liste> ; do EXPRESSION ;done
foreach i (<ensemble ou tableau>) . . . end
while (<test>) . . . end,
goto label. . . "label :".
2.1
2.1.1
TP :
Les instructions
if, while, for, case...
if
if test-commandes ; then
suite_de_commandes1
else
suite_de_commandes2
fi
while
while read line; do echo -e "$line\n"; done < file.txt
La variable line contient la ligne courante, et c’est le fichier file.txt qui est pris comme entrée standard.
for : c’est un for in liste ou un for sur les arguments du script
for sur une liste :
- - - - - - - - - - - - - - - - for a in toto tata tutu
do
echo $a
done
- - - - - - - - - - - - - - - - for en utilisant la commande interne set
- - - - - - - - fichier essai_for_set - - - - - - - - #!/bin/bash
set $(date)
for i
do
echo $i
done
- - - - - - - - - - - - - - - - $ essai_for_set
dimanche
17
décembre
2006,
11:22:10
(UTC+0100)
$
set indique les arguments du script courant
break : arrête la boucle
continue : arrête l’itération courante de la boucle et commence la prochaine itération
case
for filename in $*; do
case $filename in
*.c )
objname=${filename%.c}.o
ccom $filename $objname ;;
*.s )
objname=${filename%.s}.o
as $filename $objname ;;
*.o ) ;;
*
)
print "error: $filename is not a source or object file."
return 1 ;;
esac
done
les tests
-e fichier
vrai si le fichier existe
-r fichier
vrai si le fichier existe et est accessible en lecture (R)
-w fichier
vrai si le fichier existe et est accessible en écriture (W)
-x fichier
vrai si le fichier existe et est exécutable (X)
-f fichier
vrai si le fichier existe et est un fichier régulier
-d fichier
vrai si le fichier existe et est un répertoire
-z fichier
vrai si le fichier existe et a une taille non nulle
-o fichier
vrai si le fichier existe et nous appartient
divers
#
commentaire
(cmde)
exécute la commande dans un sous-shell
{cmde}
permet de savoir si une commande s’est bien passée (1) ou non (0)
cmd1 && cmd2
source script
séparateur conditionnel (cmd2 sera exécuté si cmd1 s’est exécuté correctement)
séparateur conditionnel (cmd2 sera exécuté si cmd1 ne s’est pas exécuté correctement)
exécution du script dans le shell courant
rehash
reconstruit la hash table de localisation des commandes
repeat n cmd
répète la commande n fois
cmd1 || cmd2
setenv/unsetenv positionne une variable d’environnement
time cmde
détermine le temps d’exécution de la commande
TP :
Utilisation de wget (ou curl, déjà installé sur Mac OSX) pour chercher des séquences IPI.
Sur le site TP d’OBI1, récupérer le fichier nucleolar-IPI-719.txt
#!/bin/bash
# proxy du cicrp
setenv http\_proxy 134.157.15.24:3128
# mieux que touch, car il faut écraser le fichier si il y a quelquechose dedans
echo -n "" > IPI.fst
while read line; do
echo $line;
curl "http://www.ebi.ac.uk/cgi-bin/dbfetch?db=IPI&id=$line&format=fasta&style=raw" | \
egrep ’(^>|^[A-Z])’ >> IPI.fst
done
Exercices suivants (utilisation de sort / uniq / join si possible) :
- Division d’un fichier fasta en un fichier par séquence
Utilisation de grep + wc dans un fichier fasta pour avoir le nombre de séquences
grep "^>" fichier_fasta.fst | wc -l
Idem mais pour avoir le nb de séquences uniques
grep "^>" fichier_fasta.fst | sort | uniq | wc -l
Chercher les entrées multiples dans un fichier fasta :
Lancer un blast avec chaque séquence d’un fasta multiple
Autres exercices possibles : Faire une récupération automatique d’un ensemble de d’image avec curl ou wget
Réduction de la taille de toutes les images trouvé par find dans un répertoire et ses sous dossiers Copier tous
les fichiers jpg d’une arborescence ailleurs en conservant l’arborescence Modifier les droits de plusieurs fichiers
dans une arborescence.

Documents pareils