BILAN SUR LE SYSTÉME DES FICHIERS
Voici une arborescence (j'ai mis les fichiers réguliers en noir et les répertoires en bleu) :
Lorsque je tape pwd, l'ordinateur me répond /home/mgaune47.
Quel est le chemin relatif des fichiers/répertoires dont le chemin absolu est :
Quel est le chemin absolu des fichiers/répertoires dont le chemin relatif est :
Une toute petite remarque sur la dernière réponse : il faut savoir qu'un répertoire contient toujours au moins deux choses : . et .. (on les voit si on tape ls -a). Le .. désigne le répertoire parent et le . désigne le répertoire lui-même. Ainsi par exemple cd .. me fait reculer d'un cran alors que cd . ne change rien. C'est pour ça que je n'arrive qu'à /home et pas à /.
On considère l'arborescence de la figure de l'exo du mercredi 17 septembre.
Lorsque je tape pwd, l'ordinateur me répond /home/mgaune47.
Rappelons que la commande ls -R liste récursivement ce que contient mon répertoire courant. Par exemple, ici elle m'affichera :
.:
test/ testbis/
./test:
f1 f2
./testbis:
(Pour bien comprendre ce que veulent dire ., ./test et ./testbis, souvenez vous que le . dans un répertoire désigne le répertoire lui-même.)
Que va m'afficher l'ordinateur si je tape la suite de commandes :
On considère l'arborescence de la figure de l'exo du mercredi 17 septembre.
Lorsque je tape pwd, l'ordinateur me répond /home/lmahio25.
Que va afficher l'ordinateur si je tape :
Que dois-je taper pour lister les répertoires :
Rappelons que * signifie "n'importe quel mot (éventuellement vide)" et que ? signifie "n'importe quel caractère" (exactement un caractère).
Souvenez vous aussi que ls rep renvoie :
fichiers_dans_rep
alors que ls rep1 rep2 renvoie:
rep1:
fichiers_dans_rep1
rep2:
fichiers_dans_rep2
Les réponses à l'exercice sont donc :
Le manuel d'une commande cmd sous FreeBSD est disponible soit en tapant man cmd dans un terminal, soit en ligne à la page du manuel sur le site de FreeBSD. Même si ça peut paraître un peu aride au premier abord, je vous conseille d'apprendre rapidement à lire les pages de man. L'information que l'on cherche est très souvent contenue dedans.
Sauriez vous trouver dans la page du manuel sur ls les informations suivantes :
Voici les réponses (avec entre parenthèses les lignes du man qui vous donnent l'information).
Je me trouve devant un terminal. Lorsque je tape pwd, l'ordinateur me répond /home/vpilau94/IS1 ; et lorsque je tape ls -GR, l'ordinateur me dit
.:
admin/ tp1/ tp2/
./admin:
info1A4 informations
./tp1:
tp1.pdf tp1.tex tp1.tar
./tp2:
tp2.pdf tp2.tex tp2.tar
J'ai le droit de taper seulement une commande. Que dois-je taper pour que si je retape ls -GR, j'obtienne :
Deux petites questions au passage :
Je tape id et l'ordinateur me répond
uid=638(vpilau94) gid=100(these) groups=100(these).
Je tape ls -Gl et l'ordinateur me répond
-r-xr-xr-- 1 vpilau94 these 2008-09-23 14:07 fichier1
-rw-r-xr-- 1 kgodel23 profs 2008-09-15 18:22 fichier2
drwxr-x--- 2 vpilau94 these 2008-09-21 15:35 rep1
drwxr-xr-x 5 dhilbe46 these 2008-08-09 09:12 rep2
Quels sont mes droits (et qu'est-ce qu'ils signifient) sur les fichiers/répertoires suivants :
Questions subsidiaires :
Les droits en octal :
Dernière chose : comme j'ai mis l'option G de ls, il m'affiche les résultats en couleur. Les répertoires sont en bleu, les fichiers non-executables sont en noir et les fichiers executables sont en vert. (Voir la page du manuel de ls.)
Je tape id et l'ordinateur me répond
uid=638(vpilau94) gid=100(these) groups=100(these).
Je tape ls -Gl et l'ordinateur me répond
-r-xr-xr-- 1 vpilau94 these 2008-09-23 14:07 fichier1
-rw-r-xrw- 1 kgodel23 profs 2008-09-15 18:22 fichier2
drwxr-x--- 1 vpilau94 these 2008-09-21 15:35 rep1
drwxr-xr-x 5 dhilbe46 these 2008-08-09 09:12 rep2
Je tape cat fichier1 et l'ordinateur me répond
toto tata titi
Je tape cat fichier2 et l'ordinateur me répond
momo mama mimi
Que va me répondre l'ordinateur si je tape :
Note : j'ai changé un tout petit peu la troisième question en rajoutant w dans les droits de o du fichier fichier2 (j'avais posé deux fois la même question sinon).
Je tape id et l'ordinateur me répond
uid=638(vpilau94) gid=100(these) groups=100(these).
Je tape ls -l fichier et l'ordinateur me répond
-r-xr--r-- 1 vpilau94 these 2008-09-23 14:07 fichier
Quels droits aurais-je sur fichier si je tape :
Que dois-je taper pour avoir comme droits
Je tape umask et l'ordinateur me répond
421.
Je tape ensuite touch fichier et mkdir rep
Quels sont les droits sur fichier et rep ?
Quelle valeur dois-je donner à l'umask pour que les droits par défaut soient
Les droits sur fichier sont 245 (666-umask), i.e., -w-r--r-x
Les droits sur rep sont 356 (777-umask), i.e., -wxr-xrw-
Les valeurs à donner à l'umask sont :
Je me trouve dans un répertoire vide.
Je tape umask et l'ordinateur me répond
421.
Je tape ensuite touch fichier et mkdir rep.
Je tape chmod ug+x,o+r fichier et chmod g=r rep.
Que va m'afficher l'ordinateur si je tape ls -Gl ?
--wxr-xr-x 1 propriétaire groupe_propriétaire 0 date fichier
d-wxr--rw- 2 propriétaire groupe_propriétaire 4096 date rep
Je tape ls -il et l'ordinateur me répond :
11501913 -rw-r--r-- 3 pilaud users 0 2008-10-01 10:47 fic1
11501913 -rw-r--r-- 3 pilaud users 0 2008-10-01 10:47 fic2
11501914 lrwxrwxrwx 2 pilaud users 4 2008-10-01 10:46 fic3 -> fic1
11501914 lrwxrwxrwx 2 pilaud users 4 2008-10-01 10:46 fic4 -> fic1
11501913 -rw-r--r-- 3 pilaud users 0 2008-10-01 10:47 fic5
11518501 drwxr-xr-x 2 pilaud users 4096 2008-10-01 10:46 rep1/
11502084 lrwxrwxrwx 1 pilaud users 4 2008-10-01 10:46 rep2 -> rep1/
Quels sont les fichiers/répertoires qui sont liés physiquement/symboliquement ?
Les fichiers/répertoires liés physiquement sont ceux qui ont le même numéro d'inoeud, c'est à dire, fic1, fic2 et fic5 d'une part et fic3 et fic4 d'autre part.
Les liens symboliques se repèrent par la flèche : fic3 et fic4 sont symboliquement liés à fic1 et rep2 est symboliquement lié à rep1.
Je tape pwd et l'ordinateur me répond :
/home/vpilau94/IS1
Je tape ls -ilR et l'ordinateur me répond :
.:
11501913 -rw-r--r-- 3 pilaud users 0 2008-10-01 10:47 fic1
11501913 -rw-r--r-- 3 pilaud users 0 2008-10-01 10:47 fic2
11501914 lrwxrwxrwx 2 pilaud users 4 2008-10-01 10:46 fic3 -> fic1
11501914 lrwxrwxrwx 2 pilaud users 4 2008-10-01 10:46 fic4 -> fic1
11501913 -rw-r--r-- 3 pilaud users 0 2008-10-01 10:47 fic5
11518501 drwxr-xr-x 3 pilaud users 4096 2008-10-02 11:37 rep1/
11502084 lrwxrwxrwx 1 pilaud users 4 2008-10-01 10:46 rep2 -> rep1/
./rep1:
11518505 drwxr-xr-x 2 pilaud users 4096 2008-10-02 11:37 rep3/
11518506 lrwxrwxrwx 1 pilaud users 4 2008-10-02 11:36 rep4 -> rep3/
./rep1/rep3:
11518502 -rw-r--r-- 1 pilaud users 0 2008-10-02 11:35 fic6
11518503 -rw-r--r-- 2 pilaud users 0 2008-10-02 11:35 fic7
11518503 -rw-r--r-- 2 pilaud users 0 2008-10-02 11:35 fic8
Que va afficher l'ordinateur si je tape
Je tape ls -l et l'ordinateur me répond :
11518501 drwxr-xr-x 8 pilaud users 4096 2008-10-02 11:37 rep/
Combien le répertoire rep contient-il de répertoires ?
Le répertoire rep contient lui-même 6 répertoires. En effet, il y a 8 liens, chacun correspondant à un répertoire contenu dans rep sauf le lien qui vient de son père et son auto-lien (le . qu'il contient forcément).
Pouvez-vous donner une suite de commande qui permet de créer l'arborescence suivante :
.:
11501913 -rw-r--r-- 3 pilaud users 0 2008-10-01 10:47 fic1
11501913 -rw-r--r-- 3 pilaud users 0 2008-10-01 10:47 fic2
11501914 lrwxrwxrwx 2 pilaud users 4 2008-10-01 10:46 fic3 -> fic1
11501914 lrwxrwxrwx 2 pilaud users 4 2008-10-01 10:46 fic4 -> fic1
11501913 -rw-r--r-- 3 pilaud users 0 2008-10-01 10:47 fic5
11518501 drwxr-xr-x 3 pilaud users 4096 2008-10-02 11:37 rep1/
11502084 lrwxrwxrwx 1 pilaud users 4 2008-10-01 10:46 rep2 -> rep1/
./rep1:
11518505 drwxr-xr-x 2 pilaud users 4096 2008-10-02 11:37 rep3/
11518506 lrwxrwxrwx 1 pilaud users 4 2008-10-02 11:36 rep4 -> rep3/
./rep1/rep3:
11518502 -rw-r--r-- 1 pilaud users 0 2008-10-02 11:35 fic6
11518503 -rw-r--r-- 2 pilaud users 0 2008-10-02 11:35 fic7
11518503 -rw-r--r-- 2 pilaud users 0 2008-10-02 11:35 fic8
Je suppose que le répertoire de travail (.) est vide.
mkdir rep1
mkdir rep1/rep3
touch fic1
touch rep1/rep3/fic6
touch rep1/rep3/fic7
ln fic1 fic2
ln fic1 fic5
ln -s fic1 fic3
ln fic3 fic4
ln -s rep1 rep2
ln rep1/rep3/fic7 rep1/rep3/fic8
ln -s rep3 rep1/rep4
Je tape ls -ilR et l'ordinateur me répond :
.:
11501913 -rw-r--r-- 3 pilaud users 0 2008-10-01 10:47 fic1
11501913 -rw-r--r-- 3 pilaud users 0 2008-10-01 10:47 fic2
11501914 lrwxrwxrwx 2 pilaud users 4 2008-10-01 10:46 fic3 -> fic1
11501914 lrwxrwxrwx 2 pilaud users 4 2008-10-01 10:46 fic4 -> fic1
11501913 -rw-r--r-- 3 pilaud users 0 2008-10-01 10:47 fic5
11518501 drwxr-xr-x 3 pilaud users 4096 2008-10-02 11:37 rep1/
11502084 lrwxrwxrwx 1 pilaud users 4 2008-10-01 10:46 rep2 -> rep1/
./rep1:
11518505 drwxr-xr-x 2 pilaud users 4096 2008-10-02 11:37 rep3/
11518506 lrwxrwxrwx 1 pilaud users 4 2008-10-02 11:36 rep4 -> rep3/
./rep1/rep3:
11518502 -rw-r--r-- 1 pilaud users 0 2008-10-02 11:35 fic6
11518503 -rw-r--r-- 2 pilaud users 0 2008-10-02 11:35 fic7
11518503 -rw-r--r-- 2 pilaud users 0 2008-10-02 11:35 fic8
Quelle(s) commande(s) dois-je taper pour :
Voici à quoi ressemble ma table d'inoeuds sur disque (j'oublie les informations concernant les tailles et les dates) :
2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
d rwxr-xr-x root admin 1 add0 |
d rwxr-xr-x root admin 5 add2 |
d rwxr-xr-x root admin 2 add19 |
d rwxr-xr-- root admin 4 add6 |
d rwxr-xr-- fdsilv48 is1 4 add3 |
d rwxr-xr-- lmahio25 is1 6 add10 |
d rwxrw-r-- mgaune47 is1 4 add5 |
d rwxr-xr-x root admin 2 add14 |
13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 |
d rwxr-xr-- fdsilv48 is1 2 - |
d rwxr-xr-- fdsilv48 is1 2 - |
d rwxr-xr-- mgaune47 is1 2 - |
d rwxr-xr-- mgaune47 is1 2 add8 |
d rwxr-xr-- lmahio25 is1 2 - |
d rwxr-xr-- lmahio25 is1 2 add15 |
- rwxrw-r-- mgaune47 is1 1 - |
- rwxr--r-- mgaune47 is1 2 add7 |
d rwxr-xr-- lmahio25 is1 2 - |
24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 |
- r-xr--r-- lmahio25 is1 2 add17 |
d rwxr-xr-- mgaune47 is1 2 add12 |
- rwxr--r-- root admin 1 add13 |
- r-xr--r-- lmahio25 is1 2 - |
- rwxr--r-- root admin 2 add16 |
- rwxr--r-- root admin 1 - |
- rwxr--r-- root admin 1 - |
... et voici la table des blocs :
add0 | add1 | add2 | add3 | add4 | add5 | add6 | add7 | add8 | add9 |
(home,3) (media,6) |
(fdsilv48,7) (mgaune47,10) (lmahio25,9) |
(Desktop,15) (rep,13) |
(test,17) (testbis,16) |
(USB1,12) (USB2,5) |
bonjour | (f1,21) (f2,22) |
add10 | add11 | add12 | add13 | add14 | add15 | add16 | add17 | add18 | add19 |
(A,20) (B,23) (AA,18) (ABC,25) |
(f5,28) (f6,24) (f7,24) |
heho | (f8,30) (f9,30) (f10,31) |
(f3,28) (f4,22) |
coucou | salut | (f11,26) (f12,33) |
Quelle est l'arborescence correspondante ?
C'est l'arborescence de la figure de l'exo du mercredi 17 septembre.
Étant donné la table d'inoeuds sur disque et la table de blocs de l'exo mercredi du 8 octobre,
La table d'inoeuds sur disque et la table de blocs sont celles de l'exo mercredi du 8 octobre.
La table d'inoeuds en mémoire est la suivante :
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
INOEUD 2 d rwxr-xr-x root admin 1 add0 |
INOEUD 10 d rwxrw-r-- mgaune47 is1 4 add5 |
INOEUD 3 d rwxr-xr-x root admin 5 add2 |
Enfin, mon superbloc est [4,11,14] et le plus petit inoeud sur disque libre et hors du superbloc est 8.
Que fait l'ordinateur (quelles sont les étapes et les algorithmes en jeu) si je tape la commande :
On ne reviendra plus sur le système de fichiers (bien qu'on l'utilisera tout le temps). Il faut savoir :
Lorsque je tape ps -o pid,ppid,stat,cmd, l'ordinateur répond :
PID PPID STAT CMD
13287 11757 Ss zsh
13289 11757 Ss zsh
14526 13287 T xclock
14528 13287 S xeyes
14632 13289 S xclock
14635 13287 S emacs
14705 13287 R+ ps -o pid,ppid,stat,cmd
Je tape alors les commandes suivantes :
kill -9 13289
kill -SIGSTOP 14528
kill -SIGCONT 14526
kill -SIGTERM 13287
Que va afficher l'ordinateur si je retape ps -o pid,ppid,stat,cmd ?
Avec le premier signal (9, ou autrement dit, SIGKILL), j'ai tué le shell 13289 et tous les processus qui en descendent. Avec les signaux SIGSTOP et SIGCONT, je suspends ou réactive une tache. Enfin, le signal SIGTERM termine une tache, mais est inactif sur un terminal. Par conséquent, l'ordinateur va afficher :
PID PPID STAT CMD
13287 11757 Ss zsh
14526 13287 S xclock
14528 13287 T xeyes
14635 13287 S emacs
14712 13287 R+ ps -o pid,ppid,stat,cmd
J'ai deux terminaux ouverts t1 et t2 dans lesquels je n'ai encore aucun job. En utilisant le job control, donner une (ou des) séquence(s) de commandes équivalente(s) aux séquences de commandes suivantes :
En lisant éventuellement le manuel de la commande test, pouvez-vous dire quelles sont les valeurs de retour des commandes suivantes :
Que font les enchainements de commandes suivants :
Quel enchainement de commande puis-je taper pour
Voici ce que font ces commandes :
Commande | Si f existe | Si f n'existe pas |
test -e f && echo present || echo absent | affiche present | affiche absent |
test -e f || echo absent && echo present | affiche present | affiche absent puis present |
test -e f && (echo present || echo absent) | affiche present | rien |
test -e f || (echo absent && echo present) | rien | affiche absent puis present |
Et voici les commandes à taper :
Lorsque je tape ps -o uid,pid,ppid,stat,cmd, l'ordinateur répond :
UID PID PPID STAT CMD
638 8930 8756 Ss zsh
638 9046 8930 T xclock
638 9047 8930 S xeyes
638 9051 8930 R+ ps -o uid,pid,ppid,stat,cmd
Lorsque je tape jobs, l'ordinateur me répond :
[1] + suspended xclock
[2] - running xeyes
Que va afficher l'ordinateur si je tape kill -SIGCONT 9046 || kill -9 9047 && test salut = bonjour || (echo différents && xclock &) && ps -o pid,stat,cmd ?
différents
PID STAT CMD
8930 Ss zsh
9046 S xclock
9047 S xeyes
9085 S xclock
9086 R+ ps -o pid,stat,cmd
Je tape echo bonjour > fic1, puis echo salut > fic2. Je suppose que je n'ai pas de fichier nommé fic3 dans mon répertoire de sorte que si je tape wc fic1 fic2 fic3, l'ordinateur répond :
1 1 8 fic1
1 1 6 fic2
wc: fic3: No such file or directory
2 2 14 total
Qu'y aura-t-il dans les fichiers out1 et out2 si je tape :
Comande | cat out1 | cat out2 |
wc fic1 fic2 fic3 > out1 2> out2 | 1 1 8 fic1 1 1 6 fic2 2 2 14 total |
wc: fic3: No such file or directory |
wc fic1 fic2 fic3 >out1 2>&1 | 1 1 8 fic1 1 1 6 fic2 wc: fic3: No such file or directory 2 2 14 total |
n'existe pas |
wc < fic1 > out1 | 1 1 8 | n'existe pas |
wc < fic3 2> out2 | n'existe pas | n'existe pas |
wc < fic1 > out1 ; wc < fic2 > out1 | 1 1 6 | n'existe pas |
wc < fic1 > out1 ; wc < fic2 >> out1 | 1 1 8 1 1 6 |
n'existe pas |
Comment peut-on faire pour :
Au besoin, on pourra se référer au manuel des commandes less cut tee sort uniq.
J'ai un fichier geo dans lequel j'ai noté les noms des capitales des pays de l'Union Européenne : lorsque je tape cat geo, l'ordinateur me répond:
Amsterdam Pays-Bas
Athènes Grèce
Berlin Allemagne
Bratislava Slovaquie
Bruxelles Belgique/Europe
Bucarest Roumanie
Budapest Hongrie
Copenhague Danemark
Dublin Irlande
Helsinki Finlande
La Valette Malte
Lisbonne Portugal
Ljubljana Slovénie
Londres Royaume-Uni
Luxembourg-Ville Luxembourg
Madrid Espagne
Nicosie Chypre
Paris France
Prague Tchéquie
Riga Lettonie
Rome Italie
Sofia Bulgarie
Stockholm Suède
Tallinn Estonie
Varsovie Pologne
Vienne Autriche
Vilnius Lituanie
Comment peut-on faire pour :
Exercice difficile
Vous avez deux terminaux t1 et t2 ouverts. Comment feriez-vous pour que :
Exercice difficile (exercice 15 de la feuille du TP 5)
Vous avez deux terminaux t1 et t2 ouverts. Comment feriez-vous pour taper des commandes dans t1, pour que ces commandes s'exécutent dans t2, et pour voir le résultat de ces commandes à la fois dans t1 et dans t2 ?
D'abord, je crée deux tubes nommés mkfifo tube1 tube2. Ensuite, dans t1, je tape cat tube2 & cat > tube1, et dans t2, je tape bash < tube1 2>&1 | tee tube2
Ce qu'il faut savoir :
Que se passe t'il si je tape $a $b pour les valeurs suivantes des variables a et b :
Que se passe t'il si je tape :
Lorsque je tape ls *, je vois
f1 f2 f3
Que se passe t'il si je tape :
L'ordinateur affiche :
Je tape ls et l'ordinateur répond :
baba bebe bobo haha hehe hoho tata tete toto
Que dois-je taper pour désigner (après expansion) exactement les fichiers :
Écrivez un executable qui lit dans le terminal deux nombres a et b (voir le manuel de la commande read) et écrit
a+b=s
(où a et b sont remplacées par leurs valeurs, et s est la somme de a et b calculée par le bash).
Dans un fichier texte, que l'on rendra executable, on écrit :
echo entrer deux entiers
read a
read b
echo $a + $b = $(($a+$b))
Écrivez un executable qui lit dans le terminal deux chaines de caractères a et b (voir le manuel de la commande read) et écrit a si elles sont identiques et a/b si elles sont différentes.
Dans un fichier texte, que l'on rendra executable, on écrit :
echo entrer deux chaines de caractères
read a
read b
if(test $a = $b)
then
echo $a
else
echo $a/$b
fi
En utilisant la commande case, écrire un executable qui demande un entier, vérifie s'il est entre 1 et 12, et renvoie le nom du mois correspondant.
Dans un fichier texte, que l'on rendra executable, on écrit :
echo "entrer un entier entre 1 et 12"
read n
case $n in
1) echo Janvier
2) echo Fevrier
3) echo Mars
4) echo Avril
5) echo Mai
6) echo Juin
7) echo Juillet
8) echo Aout
9) echo Septembre
10) echo Octobre
11) echo Novembre
12) echo Decembre
*) echo "J'avais dit un entier entre 1 et 12 ..."
esac
Je suis supersticieux. Mon nombre préféré est le 5, mais j'aime bien le 7 aussi.
Écrivez-moi un executable qui m'affiche :
Remarque : pour avoir le reste de la division de a par b, on tape $((a%b)).
Dans le troisième cas, sauriez vous en plus faire afficher le temps qu'il reste à passer avant de terminer ce mauvais moment ?
Fichier texte ... executable ... blahblah ... :
#D'abord, je calcule le reste modulo 5 du nombre de minutes écoulées depuis ce matin (remarque : pas la peine d'ajouter le nombre d'heures multipliées par 60, puisque 60 est divisible par 5)
a=$((`date "+%M"`%5))
#Ensuite, je calcule le reste modulo 7 du nombre de minutes écoulées depuis ce matin
b=$(((`date "+%H"`*60+`date "+%M"`)%7))
#Et finalement, ce n'est qu'une conditionnelle...
if ( (($a==0)) ) then echo bon moment
elif ( (($b%7==0)) ) then echo passable
elif ( (((5-$a)<(7-$b))) ) then echo "ce mauvais moment ne va durer que $((5-$a)) minute(s)"
else echo "ce mauvais moment ne va durer que $((7-$b)) minute(s)"
fi
Écrivez un exécutable qui prend en argument un chemin (absolu ou relatif) vers un fichier, et :
Attention à la différence entre arguments et variables :
if(test -f $1)
then
cat $1
else
echo entrer une phrase
read phrase
echo phrase de substitution : $phrase
fi
Écrivez un exécutable qui prend n arguments arg1 arg2 ... argn et affiche : mon premier argument est arg1, et les suivants sont arg2 ... argn (en remplaçant bien sûr arg1 ... argn par leurs valeurs respectives). On pourra se servir de la commande shift.
#Dans une variable arg1, je conserve le premier argument. Ensuite, j'utilise le shift pour décaler tous les autres arguments (la variable @ contiendra alors arg2 ... argn).
arg1=$1
shift
echo mon premier argument est $arg1, et les suivants sont $@
Écrivez un exécutable execute qui prend en arguments le nom d'une commande cmd suivi d'arguments arg1 arg2 ... argn et affiche :
la commande cmd a reçu n arguments : arg1 arg2 ... argn
et le résultat de cette commande est
res
où cmd, n, arg1 arg2 ... argn ont été remplacés par leurs valeur et res est le résultat de la commande cmd sur les arguments arg1 arg2 ... argn.
Par exemple, si un fichier fic1 contenant le mot bonjour et un fichier fic2 contenant le mot au revoir, et si je tape execute cat fic1 fic2, je dois voir apparaître :
la commande cat a reçu 2 arguments : fic1 fic2
et le résultat de cette commande est
bonjour
au revoir
Il faut utiliser la fonction shift :
cmd=$1
shift
echo la commande $cmd a reçu $# arguments : $@
et le résultat de cette commande est
$cmd $@
Écrivez un exécutable inverse qui prend en parametres :
et renvoie :
Par exemple, inverse -i haha hehe renvoie hehe haha alors que inverse haha hehe renvoie haha hehe.
if([ $1 = "-i" ]) then echo $3 $2 ; else echo $1 $2 ; fi
Écrire un exécutable centre qui prend en argument un mot m et affiche :
Par exemple, centre bonjour va afficher j tandis que centre coucou va afficher uc.
On peut utiliser une conditionnelle :
n=${#1}
a=$((n%2))
b=$((n/2))
if (($a==0)); then echo ${1:$(($b-1)):2}; else echo ${1:$b:1}; fi
Pour ceux qui veulent réfléchir un peu, on peut aussi faire ça sans conditionnelle :
echo ${1:$((${#1}/2-1+${#1}%2)):$((2-${#1}%2))}
Ècrire un exécutable repetitions qui prend en argument un mot m et affiche autant d'occurences de la première lettre de m qu'il y en a au début de m. Par exemple, repetitions aaaabcabb doit afficher aaaa.
Vous pouvez utiliser :
METHODE 1 : recursif
Dans un executable nommé occurencesInitiales, j'écris :
if ((${#2}==0)) || test ${2:0:1} != "$1"; then echo ""; else echo -n $1; ./occurencesInitiales $1 ${2:1}; fi
Autrement dit, occurencesInitiales prend en argument une lettre a et un mot m. Il teste si a est la première lettre de m. Si c'est le cas, il affiche a puis recommence avec le mot m privé de sa première lettre. Sinon, il s'arrête.
Ensuite, dans l'exécutable repetitions on écrit juste :
./occurencesInitiales ${1:0:1} $1
METHODE 2 : boucle
Dans l'exécutable repetitions on écrit :
i=0
while (($i<${#1})) && test ${1:$i:1} = ${1:0:1}
do
echo -n ${1:0:1}
i=$(($i+1))
done
echo
METHODE 3 : sed
Dans l'exécutable repetitions on écrit juste :
echo $1 | sed 's/\(.\)\(\1*\)[^\1].*/\1\2/'
En utilisant une des trois possibilités de l'exercice du Jeudi 27 novembre (i.e., récursivité, boucles, ou sed), proposez un exécutable qui prend en argument un mot et affiche toutes ses lettres en position impaire : la première, la troisième, la cinquième, etc. Par exemple impair abcde doit afficher ace.
METHODE 1 : recursif
Dans l'exécutable impair on écrit :
echo -n ${1:0:1}
if((${#1}>2)); then ./impair ${1:2}; else echo ""; fi
METHODE 2 : boucle
Dans l'exécutable impair on écrit :
i=0
while (($i<${#1}))
do
echo -n ${1:i:1}
i=$(($i+1))
done
echo
METHODE 3 : sed
Dans l'exécutable impair on écrit juste :
echo $1 | sed 's/\(.\)./\1/g'
Dans un fichier fic, j'ai rentré des lignes de texte.
Dans un fichier fic, j'ai rentré des lignes de texte.
Écrivez un exécutable qui prend en argument un mot et retourne comme valeur de retour 0 si ce mot contient deux lettres identiques qui se suivent, et 1 sinon.
Dans un fichier doubleLettre, que je rends exécutable, je tape :
expr $1 : ".*\([a-zA-Z]\)\1" > /dev/null
Écrire un exécutable qui prend en argument un répertoire (chemin relatif ou absolu) et transforme le noms de tous les fichiers situés dans ce répertoire en y ajoutant la date avant le premier point : par exemple, le 10 décembre 2008, un fichier nommé fic.pdf doit être renommé en fic20081210.pdf.
Dans un fichier ajouterDate, que je rends exécutable, je tape :
for fic in $1/*
do
mv $fic $(echo $fic | sed -e "s/\([^.]*\)\./\1$(date +%Y%m%d)\./" -e "s/^\([^.]*\)$/\1$(date +%Y%m%d)/")
done
Écrire une ligne de commande qui demande à l'utilisateur un nombre et affiche s'il est premier ou pas.
echo -n "entrer un entier "
read n
i=2
while (($i*$i<=$n))
do
if (($n%$i==0)) ; then echo "pas premier"; exit ; fi
i=$(($i+1))
done
echo "premier"
Écrire un exécutable qui demande quel était le jour de la semaine (lundi, mardi,...,dimanche) le premier janvier, et si nous sommes dans une année bissextile, et affiche tous les jours de l'année sous la forme jour date mois. Par exemple, si on répond mardi et oui (comme en 2008), l'exécutable doit afficher :
mardi 1 janvier
mercredi 2 janvier
etc
mercredi 31 décembre
BONNE ANNÉE
D'abord, j'ai besoin de quelques petits exécutables intermédiaires (je vous laisse écrire les deux premiers...) :
Ensuite, j'écris dans mon exécutable afficherAnnee :
echo -n "Quel jour étions nous le 1 janvier ? "
read jour
echo -n "Sommes-nous dans une année bissextile ? "
read rep
for((m=1; m<=12; m++))
do
for((j=1; j<=$(nbrjours $m $rep); j++))
do
echo $jour $j $(mois $m)
jour=$(jourSuivant $jour)
done
done
echo BONNE ANNEE
Ce qu'il faut savoir :