\slide[ A!A!B , "unix et programmation shell" ] \ascii[ A, src "ascii/su.txt" ] \ascii[ B, src "ascii/pm.txt" , noline ] \slide[ AA!BC!DD!EE , "naissance de unix"] \keyword hacker hackers \keyword unix \keyword Linux \zone[ A ] \play[lynx, "http://fr.wikipedia.org/wiki/Unix"] \text Parmi les célèbres hackers du siècle passé, deux pionniers des Bell-Labs sont à l'origine du système unix. \zone[ B, "Kenneth Thompson", hidden ] \text système UNICS (1969) \zone[ C, "Dennis Richie" , hidden] \text langage C (1970) \zone[D, hidden ] \play [ lynx, "http://www.blaess.fr/christophe/livres/programmation-systeme-sous-linux"] \text La programmation système en langage C sous Linux : un moyen d'apprendre et contrôler ses connaissances des systèmes unix. \alarm[ "1971", 10 by 60 , at 10 by 10 ] \play[ lynx, "http://www.epi.asso.fr/revue/histosom.htm"] \text Apparition de l'informatique dans les lycées français : le langage C et unix seront introduits trés tard (2010?) dans les programmes du secondaire laissant place à des langages comme LSE, BASIC, PASCAL, et des systèmes d'exploitation comme CPM, MS-DOS, WINDOWS. \keyword opengroup unices \slide[ ABCC!XXDE!XXFG!XXHH , "chronologie"] \zone[ A,"1965" ,hidden ] \text multics \zone[ B,"1969", hidden] \text unics \zone[ C,"1970-80",hidden] \text unix \zone[ D,"1977",hidden] \text BSD \zone[ E,"1983",hidden] \text system V \zone[ F ,hidden] \text freeBSD openBSD netBSD mac OS X \zone[ G ,hidden] \text HP-UX AIX XENIX ULTRIX \zone[ H ,hidden] \text solaris linux gnu/linux android \ascii[X, src "ascii/test.txt", cyan , noline] \slide[ AAA!BCD!EGF!ZZZ, "unix populaire" ] \zone[ A ] \text unix a donné naissance à la famille des unices dont les plus populaires \zone [B, "1983"] \play[ lynx, "http://fr.wikipedia.org/wiki/UNIX_System_V"] \text System V : Bell, ATT. \zone[ C, "1977" ] \play[ lynx, "http://fr.wikipedia.org/wiki/Berkeley_Software_Distribution" ] \text BSD : Berkeley Sofware Distribution. \zone[ D, "1990"] \play[ lynx, "http://fr.wikipedia.org/wiki/Linux"] \text GNU/Linux : logiciel libre \zone[ E, "1999"] \play[ lynx, "http://fr.wikipedia.org/wiki/OS_X"] \text mac OS X : next, apple. \ascii[ G, src "ascii/unices.txt" , noline ] \zone[ F, "2003" ] \play[lynx, "http://fr.wikipedia.org/wiki/Android"] \text android : androïde, google \zone[Z] \play[ lynx, "http://www.opengroup.org"] \text L'ensemble des acteurs du développemement du système unix forme l'opengroup, propriétaire de la marque unix, il certifie les systèmes unix. \keyword BSD GNU \slide[AAAAAA!BBCCDD!BBCCDD!EEEFFF, "influences"] \zone[A] \text Trois groupes influent sur la normalisation des systèmes unix : \zone[ B,"POSIX"] \play[lynx, "http://fr.wikipedia.org/wiki/POSIX"] \text Portable Operating System Interface : IEEE. \zone[ C, "J. Anderson", cyan , bottom ] \play[lynx, "http://fr.wikipedia.org/wiki/Berkeley_Software_Distribution"] \text [unix] BSD is one of the two major products coming out of Berkeley, not a coincidence :-) \zone[D, "GNU"] \play[lynx, "http://fr.wikipedia.org/wiki/GNU"] \text Gnu is Not Unix : logiciel libre. \zone[E, "R. Stallman", bottom , magenta] \play[lynx, "http://www.gnu.org/gnu/thegnuproject.fr.html"] \text Le projet GNU. \zone[F, "E. Raymond", bottom, magenta ] \play[lynx, "http://fr.wikipedia.org/wiki/La_Cathédrale_et_le_Bazar"] \text La cathédrale et le bazar. \keyword ps tar \keyword script scripts \slide[ AAB!CCC , "dialecte" ] \ascii[ src "ascii/bug.txt" , noline , 20 by 60 ] \zone[ C , hidden ] \play[ shell, "man ps" ] \text La plupart des commandes historiques comme ps pour la gestion des processus, la commande tar pour l'archivage etc... maintiennent les différents jeux d'options pour des raisons de compatibilité et transition à l'attention des anciens scripts. \alarm[ B ] \text Il faut faire un choix pour éviter les confusions. \keyword distribution ubuntu debian \keyword kernel noyau hurd utilitaire utilitaires \slide[ AAA!BXC!DDD, "GNU/linux"] \zone[ A ] \text Dans les salles de travaux-pratiques, vous utiliserez un système d'exploitation GNU/linux, fusion de deux composantes du logiciel libre \zone[B, "linux, 1991"] \play[ lynx, "http://fr.wikipedia.org/wiki/Linux"] \text noyau (kernel), Linus Torvalds. \zone[C, "gnu, 1983"] \play[ lynx, "http://fr.wikipedia.org/wiki/Richard_Stallman"] \text utilitaires, Richard Stallman. \zone[D] \text Plus précisément, une distribution ubuntu, basée sur debian. Il s'agit d'un environnement de travail unix de qualité directement issu du logiciel libre. \alarm[ X, "hurd" ] \text le noyau gnu n'est pas encore opérationnel. \slide[ AB!AB!CC, "GNU/linux"] \ascii[ A, src "ascii/gnu.txt" , "gnu", bottom] \ascii[ B, src "ascii/tux.txt" , "tux", bottom] \zone[C] \play[ lynx, "http://fr.wikipedia.org/wiki/Linux_ou_GNU/Linux"] \text Le nom GNU/Linux fut utilisé pour la première fois par debian en 1994 pour le nom de leur distribution du système d'exploitation basé sur le noyau Linux et des logiciels GNU. \slide[ A , "Libérez Unix !" ] \zone[A, "Richard Stalmann, Septembre 1983", bottom] \play[lynx, "http://www.gnu.org/gnu/initial-announcement.fr.html"] \text A partir de Thanksgiving je vais écrire un système logiciel complet compatible avec Unix appelé GNU (Gnu N'est pas Unix), et le distribuer librement (ou gratuitement ?) à quiconque voudra l'utiliser. Il y a grand besoin de contributions sous forme de temps, d'argent, de programmes et d'équipement. Pour commencer, GNU comprendra un noyau ainsi que tous les utilitaires requis pour écrire et faire tourner des programmes C : éditeur, interpréteur de commandes, compilateur C, éditeur de liens, assembleur et quelques autres encore. Par la suite, nous ajouterons un formateur de texte, un YACC, un jeu Empire, un tableur et des centaines d'autres choses. A terme, nous espérons fournir tous les composants utiles venant normalement avec un système Unix, ainsi que tout autre composant utile, y compris de la documentation en ligne et imprimée. GNU sera capable de faire tourner des programmes Unix mais ne sera pas identique à Unix. Nous en améliorerons le côté pratique de toutes les manières possibles, en nous basant sur notre expérience d'autres systèmes d'exploitation. En particulier, nous avons l'intention d'implémenter des noms de fichiers plus longs, des numéros de version sur les fichiers, un système de fichiers résistant aux plantages \slide[A,"Hello everybody out there using minix"] \zone[A, "Linus Torvalds, Aout 1995", bottom ] \play[lynx, "http://en.wikipedia.org/wiki/History_of_Linux"] \text I'm doing a (free) operating system (just a hobby, won't be big and professional like gnu) for 386(486) AT clones. This has been brewing since april, and is starting to get ready. I'd like any feedback on things people like/dislike in minix, as my OS resembles it somewhat (same physical layout of the file-system (due to practical reasons) among other things). I've currently ported bash(1.08) and gcc(1.40), and things seem to work. This implies that I'll get something practical within a few months, and I'd like to know what features most people would want. Any suggestions are welcome, but I won't promise I'll implement them :-) Linus (torvalds [at] kruuna.helsinki.fi) PS. Yes – it's free of any minix code, and it has a multi-threaded fs. It is NOT portable (uses 386 task switching etc), and it probably never will support anything other than AT-harddisks, as that's all I have :-(. \slide[A, "paquets gnu (2012)"] \zone[A] \text a2ps acct acm adns aetherspace alive anubis archimedes aris aspell auctex autoconf autoconf-archive autogen automake avl ballandpaddle barcode bash bayonne bazaar bc bfd binutils bison bool bpel2owfn c-graph ccaudio ccide ccrtp ccscript cflow cgicc chess cim classpath classpathx clisp cobol combine commoncpp complexity config coreutils cpio cppi cssc dap dc ddd ddrescue dejagnu denemo dia dico diction diffutils dionysus dismal djgpp dmd dominion dotgnu dotgnu-forum dotgnu-pnet dr-geo ed edma electric emacs emacs-muse emms enscript eprints epsilon fdisk ferret findutils fontutils freedink freefont freeipmi freetalk fribidi gama garpd gawk gcal gcc gcide gcl gcompris gdb gdbm gengen gengetopt gettext gforth ggradebook ghostscript gift gimp gleem glib global glpk glue gmediaserver gmorph gmp gnash gnat gnats gnatsweb gnome gnowsys gnu-arch gnu-c-manual gnu-crypto \slide[A, "paquets gnu (2012)"] \zone[A] \text gnuae gnubatch gnubg gnubiff gnubik gnucap gnucash gnucomm gnue gnufm gnugo gnuit gnujdoc gnujump gnukart gnulib gnumach gnumed gnumeric gnump3d gnun gnunet gnupg gnupod gnuprologjava gnuradio gnurobots gnuschool gnushogi gnuskies gnusound gnuspeech gnuspool gnustandards gnustep gnutls gnutrition gnuzilla goptical gorm gpaint gperf gprolog grabcomics greg grep gretl groff grub gsasl gsegrafix gsl gsrc gss gtick gtk+ gtypist guile guile-dbi guile-gnome guile-gtk guile-ncurses guile-rpc gurgle gv gvpe gxmessage gzip halifax health hello help2man hp2xx httptunnel hurd hyperbole icecat idutils ignuit indent inetutils intlfonts jacal java-getopt jdresolve jel jwhois kawa kopi leg less libc libcdio libextractor libffcall libgcrypt libiconv libidn libmatheval libmicrohttpd libredwg librejs libsigsegv libtasn1 libtool libunistring libxmi lightning lilypond linux-libre liquidwar6 lispintro lrzsz lsh m4 macchanger mailman mailutils \slide[A, "paquets gnu (2012)"] \zone[A] \text make marst maverik mc mcron mcsim mdk mediagoblin melting metaexchange metahtml mifluz mig miscfiles mit-scheme moe motti mpc mpfr mtools myserver nana nano ncurses nettle network ocrad octave oleo orgadoc osip packaging panorama paperclips parallel parted pascal patch paxutils pcb pdf pem pexec pgccfd phantom-home phpgroupware pies pipo plotutils polyxmass powerguru proxyknife pspp psychosynth pth pythonwebkit qexo quickthreads radius rcs readline recutils reftex rottlog rpge rush sather scm screen sed serveez sharutils shishi shmm shtool sipwitch slib smalltalk smarteiffel snakecharmer social solfege sourceinstall spacechart speex spell sqltutor src-highlite stalkerfs stow stump superopt swbis sysutils talkfilters tar termcap termutils teseq teximpatient texinfo texmacs thales time tramp trans-coord trueprint units unrtf userv uucp vc-changelog vc-dwim vcdimager vera vmgen vmslib w3 wb wdiff websocket4j webstump wget which womb xaos xboard xhippo xlogmaster xmlat xnee xorriso zile \keyword ncurses gzip less more grub grep groff roff a2ps chess vi vim emacs gedit \keyword aspell bash bc flex bison awk gawk gcc gdb glib gmp \keyword make gimp grof gcov valgrind indent dot \slide[ A , "noyau"] \ascii[ A, src "ascii/kernel.txt" ] \keyword distribution debian ubuntu redhat fedora centOS \slide[ AB!CB, "distribution"] \ascii[ B, src "ascii/debian.txt", red , noline ] \zone[ A ] \text Les distributions linux font légion : debian, ubuntu, redhat, fedora, centOS... \zone[ C , hidden ] \text Le système GNU/linux est mis en forme au sein de diverses distributions qui intègrent le noyau linux et les utilitaires GNU \slide[AAB!AAC!AAD, "exemple" ] \term[ A ] \prompt $ uname -mors .Linux 2.6.34.9-69.fc13.i686 i686 GNU/Linux $ ssh pl@192.168.0.150 uname -mors .Linux 3.8.13-100.fc17.i686.PAE i686 GNU/Linux $ ssh pl@ouaib.univ-tln.fr uname -mors .Linux 2.6.18-53.1.4.el5 i686 GNU/Linux $ ssh pl@imath01 .Linux 2.6.18-348.4.1.el5.centos.plus x86_64 GNU/Linux \term[ B , "man uname"] \play[ shell, "man uname" ] \term[ C , "uname"] \play[ shell, "uname -rions; read" ] \prompt $ uname -rions \term[ D , "cpu"] \play[ shell, "lscpu ; cat /proc/cpuinfo; read" ] \prompt $ lscpu $ cat /proc/cpuinfo \slide[ AAAZ!BXXG!CXXE!DFFF, "shell ?"] \ascii[ X, src "ascii/cowshell.txt" , hidden , "cow say" , bottom ] \zone[ A ] \text Le dictionnaire de la communauté unix est truffé de quelques bizarreries, sigles et acronymes \zone[F, hidden, bottom, "Larry Wall"] \text It is easier to port a shell than a shell script !? \zone[B, hidden ] \text posix \keyword posix foobar shabang biff \zone[E, hidden ] \text bash ! \zone[C, hidden ] \play[ lynx, "http://en.wikipedia.org/wiki/Biff"] \text biff \zone[D, hidden , "FAQ" ] \play[lynx , "http://langevin.univ-tln.fr/cours/UPS/extra/unixfaq.html"] \text unix Frequently Asked Questions. \zone[G , "RFC-3092", bottom , hidden ] \play[ lynx, "http://tools.ietf.org/html/rfc3092"] \text foo bar \zone[ Z , hidden ] \play[ lynx , "http://www.ietf.org" ] \text Int. Eng. Task Force \slide[ A, "rôle du shell" ] \ascii[ A, src "ascii/role.txt" ] \slide[ A, "hello world" ] \ascii[ A, src "ascii/echo.txt" ] \slide[ AAAA!AAAA!BBCC!EEDD, "Thompson shell" ] \keyword pipeline pipe tube redirection \zone[ A ] \text La notion de shell apparaît dans le système MULTICS, il s'agit d'une application à l'interface entre le noyau et les utilitaires. Le shell développé au début des années 70 par Thompson est un interprète de commandes qui introduit la syntaxe des deux opérateurs fondamentaux des systèmes unix \term[B, "redirection", hidden] \prompt $ commande > destination < source \term[C, hidden, "pipeline"] \prompt $ commande | commande | commande \zone[D, hidden ] \play[lynx, "http://en.wikipedia.org/wiki/Douglas_McIlroy"] \text i.e. le pipe de Douglas McIlroy \zone[E, hidden ] \play[lynx, "http://man.cat-v.org/unix-1st/1/sh"] \text c.f. man 1 sh at unix-1st \keyword ltrace strace processus \slide[ AAAA!AAAA!BBBB!BBBB!XCDZ, "trace"] \zone[A] \text Les débogueurs ltrace et strace renseignent sur les appels bibliothèques et systèmes effectués par un processus : \ascii[ B, src "script/hello.sho"] \play[ shell , "script/hello.sho" ] \zone[ C ] \play[ vim, "out/hello-lib.out"] \text hello-lib.out \zone[ D ] \play[ vim, "out/hello-sys.out"] \text hello-sys.out \slide[ AB!AB!CC!DD, "Bourne [Again] shell" ] \zone[A, "Bourne shell"] \play[ lynx, "http://fr.wikipedia.org/wiki/Bourne_shell" ] \text Outil de scriptage (Stephan Bourne) des commandes pour faciliter l'administration du système du système unix V7. \keyword sh alias history root \zone[ B, "/bin/sh" ] \text trés populaire pour sa facilité d'emploi et sa rapidité, standard des systèmes unix, c'est toujours le shell par défaut du compte root, de certaines commandes comme make. \alarm[ C, ":-(" ] \text sh ne gère ni les alias, ni l'historique des commandes ni le contrôle des processus \zone[ D, "bash" , hidden ] \play[ lynx, "http://fr.wikipedia.org/wiki/Bourne-Again_shell" ] \text Le Bourne Again shell est un projet GNU démarré en 1980 par Brian Fox, actuellement maintenu par Chet Ramey. \slide[ A , "shell par défaut"] \term[ A ] \prompt $ /bin/sh . sh-4.1$ exit . exit $ which sh . /bin/sh $ ls -l /bin/sh .lrwxrwxrwx. 1 root root 4 9 aout 08:47 /bin/sh -> bash $ echo $SHELL . /bin/bash $ echo -e 'all:\n\techo $(SHELL)' > /tmp/makefile $ make /tmp .make: entrant dans le repertoire /tmp .echo /bin/sh ./bin/sh .make: quittant le repertoire /tmp \slide[ AEBB!CCDD, "shell populaires"] \zone[ A ] \text Les shells font légion. \ascii[ E, src "ascii/lambi.txt"] \this[ B , "shell usage" , hidden ] \play[lynx, "http://en.wikipedia.org/wiki/Comparison_of_computer_shells"] \prompt -sh 6 490 000 -bash 5 380 000 -ash 345 000 -ksh 323 000 -csh 254 000 -tcsh 116 000 -zsh 86 000 \zone[D, "shabang" ] \text googeling (mdr) sur les shabangs fait ressortir deux shells : sh et bash \zone[C, hidden ] \play[lynx,"http://fr.wikipedia.org/wiki/Lambis"] \text Ces slides concernent bash, mon shell préféré... Aprés le lambis bien entendu ! \slide[ AA!BC!DD, "interface"] \zone[ A ] \text L'utilisateur d'un ordinateur interagit avec le système d'exploitation au moyen d'une interface graphique ou bien d'une interface texte. \zone[B, "GUI"] \text Graphic User Interface \zone[C, "CLI"] \text Command Line Interface \zone[D, "xshell" ] \text La notion de shell s'étend à l'ensemble des interfaces y compris graphique : gnome, kde, lxde, xfce, awesome \alarm[ B ] \text L'évolution des GUIs fait souvent débat ! \alarm[ C ] \text Le monde des CLIs paraît plus zen ! \slide[A!B!C, "CLI vs GUI"] \this[A] \prompt -Le mode graphique se veut intuitif et facile d'emploi. -Le mode textuel est puissant mais peu intuitif. \zone[B, hidden ] \text Il n'y a pas lieu d'opposer les deux modes qui sont parfaitement complémentaires, les tâches sur les fichiers textes sont plus faciles à réaliser par la console. \zone[C, hidden ] \text En général, un utilisateur sous X ouvre des pseudos terminaux pour effectuer certaines tâches avec l'interprète de commande. \slide[ AB!CC!DD, "exemple"] \zone[ B, "c-production?"] \text combien de lignes de code C dans les sources du répertoire ~/cc ? \alarm[A, "X-fails!", 6 by 30] \text Difficile de répondre à cette question par des clics de souris \zone[ C , hidden] \text Plusieurs solutions textuelles. Au fil des années, les utilitaires unix ont été développés, améliorées pour répondre efficacement ce type de questions. \slide[C!A!A!B!B, "Une ligne de commande"] \term[ C ] \play[ shell, "find ~/cc -name '*.c' -exec wc -l {} \;|awk '{s+=\$0} END {print s}'"] \prompt $ find ~/cc -name "*.c" -exec wc -l {} \;| awk '{s+=$0} END {print s} \this[A, hidden] \prompt - find : outil pour la recherche de fichiers. - wc : compter les lignes, mots, octets. - awk : filtre d'Alfred Aho, Peter Weinberger et Brian Kernighan \zone[B, hidden] \text Une solution facile à comprendre plus difficile à reproduire sans connaître les usages des commandes et arguments passés par la ligne de commande. \slide[ AB!CC, "script"] \zone[A] \text Le rôle d'un informaticien est de réaliser des travaux avec une machine, le plus souvent, dans un temps limité ! \zone[B, hidden ] \text Il convient alors d'éviter des pertes de temps qui ont pour origine : erreurs , lacunes \zone[C, hidden] \text Un script est un fichier de commandes pour le shell. La première ligne du script peut préciser le shell d'exécution : c'est le fameux shabang. \slide[ AB!CD, "un premier script"] \term[A, "exécutable"] \prompt $ chmod u+x cprod.sh $ ./cprod.sh '~/cc' '*.c' \zone[B, "cprod.sh" ] \text Le fichier texte cprod.sh contient une liste de commande pour bash. Il faut lui attribuer des droits pour en faire un exécutable. \term[C, "exec cprod.sh"] \prompt \play[ shell, "script/cprod.sh ~/cc '*.c'"] run \term[D, "vim cprod.sh"] \play[ vim, "script/cprod.sh"] \prompt edit \slide[ A!B!C, "commande complexe"] \zone[A] \text Avec de la pratique, il est possible de d'exécuter une tâche complexe directement en ligne de commande : \term[B] \prompt $ find ~ -name "*.txt" -exec wc -l {} \; - | ( sum=0; while read num rem ; - do let sum+=$num; done; echo $sum) > sum.txt \zone[C] \text Il s'agit d'une commande composée s'articulant sur des commandes simples incluant un pipeline et une redirection.