Outils pour utilisateurs

Outils du site


salles:linux

Linux sur les postes de TPs

Comme nous sommes une université d'informatique, nous nous devons de faire montre d'une certaine diversité en ce qui concerne les environnements de travail. Linux, de ce point de vue, est le dernier bastion du logiciel libre dans une infrastructure comprenant du Windows et du Mac à foison.

Pour ceux qui ne le savent pas déjà, Linux est un kernel libre (et gratuit) écrit en 1991 par Linus Torvalds, son dictateur bienveillant, pour lutter contre la fermeture croissante des logiciels industriels à cette époque. Couplé avec quelques outils supplémentaires (souvent la suite GNU, d'où l'amalgame courant GNU/Linux pour décrire la combinaison des deux), il donne accès aux même fonctionnalités que Windows ou Mac, mais souvent sous une forme plus anarchique et plus configurable.

Il existe à ce jour de nombreuses implémentations différentes de Linux (souvent appelées distributions), chacune possédant son propre fonctionnement et sa propre culture. Ici à l'IM²AG, nous employons essentiellement des Debian et dérivés (Ubuntu, par exemple), qui sont parmi les Linux les plus faciles à appréhender. Vous pourrez observer que nous utilisons des Debian sur nos serveurs, et vous trouverez des Ubuntu dans les salles de TP.

Le logiciel libre

Contrairement à tous les systèmes grand public, Linux est doté d'une philosophie et d'une intention de partage. Car en effet, aux débuts de l'informatique, comme la plupart des programmes ne marchaient guère, et le reste moins encore, c'était pratique courante que de s'échanger de petits bouts de code avec le labo d'à côté.

Hélas, dès que l'on a cherché à vendre les logiciels ainsi écrits, ces échanges incessants se sont établis comme les ennemis du business model. En effet, qui irait acheter du code alors qu'il/elle pourrait tout aussi bien le copier et le compiler gratuitement chez soi ?

Pour pallier ce “défaut” du logiciel libre, les premiers vendeurs de logiciels ont trouvé la parade : ils distribuent le logiciel compilé, ainsi qu'un manuel d'utilisation, mais gardent le code (et les possibilités d'amélioration de ce dernier) bien au chaud sur leurs disques.

Heureusement, certains (dont Linus Torvalds et également Richard Stallman) se sont insurgés contre cette atteinte à leur liberté créatrice et ont décidé d'écrire leurs propres logiciels et de les redistribuer à qui voudra (code source compris) selon les quatres libertés fondamentales :

  • La liberté d'éxécuter le logiciel comme bon nous semble
  • La liberté de lire et de modifier le code source pour adapter le comportement du programme à nos besoins
  • La liberté d'aider notre voisin en redistribuant les programmes récupérés d'ailleurs
  • La liberté de contribuer à notre communauté en redistribuant les programmes que l'on aura modifié au préalable

Ces quatres libertés forment la philosophie du logiciel libre (“Free Software” en anglais) et permettent à GNU/Linux de rivaliser en qualité avec des logiciels propriétaires avec une fraction des moyens dont disposent ces derniers.

Comme partager nos idées sans encombres est une étape indispensable du processus de recherche scientifique, Linux et les logiciels libres accompagnent admirablement les enseignements dispensé ici à l'UFR.

Linux et la ligne de commande

Vous trouverez de nombreux tutoriels sur le Web expliquant comment faire obéir votre Linux, et le sujet est trop vaste pour être traité ici. Par contre, je peux vous assurer qu'à un moment ou l'autre, vous allez tomber sur une explication commençant par “ouvrez une invite de commandes et entrez …”, contrairement à Windows et Mac qui font tout à votre place.

La ligne de commande a la réputation d'être austère, difficile à maîtriser et peu “user-friendly”, et est souvent vue comme un reliquat des années 80 que l'on devrait s'empresser d'abandonner au profit d'interfaces plus visuelles. Pour moi, la différence entre la ligne de commande et les GUI et la même qu'entre les livres et les films. Si je veux juste me distraire entre deux activités, je regarderai un film, mais si je veux rentrer dans les détails d'un univers, je me procurerai plutôt un livre.

Similairement, la ligne de commande, bien que moins rapide, permet bien plus de précision et de clarté que les interfaces graphiques, car il y a un véritable langage qui se cache derrière (communément appelé le Shell), contrairement à ces dernières qui sont trop souvent conçues informellement et manquent parfois de composabilité et de réutilisabilité.

Pour vous aider à tirer parti du pouvoir et de l'expressivité du Shell, voici une explication sommaire des utilisations diverses de la ligne de commande. Les exemples seront en bash, l'un des shells les plus courants sous Linux, BSD et MacOS.

Ouvrir un shell

Le plus important, avant d'apprendre le langage, est de pouvoir tester ce que l'on apprend, bien sûr ;-) Pour ouvrir un shell sous Linux, il y a une myriade de façons différentes :

  • Taper <alt>-t ou <ctrl>-<alt>-t ouvre un terminal (un autre nom de l'invite de commande) dans une nouvelle fenêtre.
  • Comme Guake est installé sur les postes, vous pouvez aussi taper <f12> et avoir un terminal persistant.
  • Si rien de tout ça ne marche, vous pouvez (presque) toujours vous connecter sur un terminal virtuel en tapant <ctrl>-<alt>-<f1..f6>

Maintenant que vous avez accès à votre terminal, voici les quelques notions de base.

Les commandes

Les commandes sont l'objet le plus simple que l'on peut écrire en Shell. Une commande s'écrit de la forme suivante :

<fonction> <param1> <param2>...

où la fonction et les paramètres sont des mots comme ls, html ou “Coucou à toi !”. Notez que si on veut donner des espaces à un mot, il faut l'entourer de guillemets, car sinon il est lu comme deux mots côte à côte.

Ensuite, la fonction est éxécutée avec tous ses paramètres et le résultat est écrit à l'écran.

C'est la forme la plus courante d'expression que vous retrouverez dans le Shell (tous les git commit, ls -la foobar, mkdir x sont des commandes simples, par exemple).

Les variables

Chaque commande dans le Shell est appelée dans un certain contexte (que l'on appelle l'environnement) qui définit un certain nombre de variables (dites variables d'environnement). On peut faire deux choses avec des variables : lire et écrire.

Pour écrire dans une variable, on fait comme suit

variable=valeur

Pour lire une variable, on l'écrit $variable ou encore ${variable} (nous verrons plus tard en quoi la seconde formulation peut être utile).

Certaines variables sont prédéfinies par le Shell lui-même et permettent d'obtenir des informations sur l'utilisateur actuel, le dossier de travail ou encore le nom de l'ordinateur. Certaines de ces variables peuvent être modifiées pour étendre la fonctionnalité de votre Shell. Voici une liste abrégée des variables les plus courantes :

  • PWD (Process Working Directory, ou Répertoire de Travail du Processus) : contient le chemin du dossier dans lequel on se trouve (peut être modifié)
  • USER : votre nom d'utilisateur
  • HOME (le Foyer) : nom du dossier personnel (équivalent de C:/Users/<utilisateur> sous Windows)
  • SHELL : chemin du programme qui interprète les commandes que vous tapez (souvent /bin/bash ou /usr/bin/zsh)
  • PATH : liste de chemins, séparés par des :, où le Shell va chercher les programmes que vous lui demandez d'éxécuter.
  • LANG : votre langue préférée (si cette variable n'a pas de valeur, vous aurez la langue par défaut du système). Cette variable doit avoir un format tout particulier (si vous voulez qu'elle ne soit pas ignorée) : si vous préférez le français, il lui faut fr_FR.UTF-8, et si c'est la langue de Shakespeare que vous convoitez, ce sera en_US.UTF-8
  • PS1 (Prompt String #1 ou Invite Principale) : le texte qui est ajouté au début de chaque ligne de commande interactive. Dans les salles de TP et sur certains serveurs, la PS1 par défaut est colorée et contient pas mal d'informations. Si cela ne vous sied pas, vous pouvez lui rendre son aspect original en entrant export PS1='\u@\h\$ '

Pour récapituler par exemple, voici une commande qui permet de changer temporairement la langue employée par le Shell à votre égard :

export LANG=en_US.UTF-8

Le export indique au Shell que tous les programmes appelés héritent de cette variable, pas seulement la session courante.

Personnaliser son Shell

Lorsque vous ouvrez une console interactive, votre Shell éxécute automatiquement un script dans votre HOME avant de vous donner la main. Cela vous permet de surcharger le comportement du système pour l'adapter à vos besoins.

Par exemple, si vous installez vos propres programmes dans $HOME/.bin, vous pouvez les rendre accessibles en ajoutant ce dossier à votre PATH. En Bash, cela donne la ligne suivante à ajouter au .bashrc :

PATH="$HOME/.bin${PATH:+:}$PATH"

Le bout de code bizarre en sandwich est l'un des intérêts des accolades autour du nom de la variable qui permettent non seulement de délimiter son nom, mais aussi d'y appliquer certaines transformations.

Utilisation avancée des variables

Dans le cas présent, cette petite astuce permet de gérer correctement le cas où le PATH serait vide avant l'ajout du nouveau chemin.

En effet, en écrivant simplement $HOME/.bin:$PATH, cela donnerait un PATH de $HOME/.bin:. Pour éviter les deux points supplémentaires à la fin, il faut dire à Bash de les écrire seulement si le PATH n'est pas vide. Par chance, c'est exactement ce que veut dire ${PATH:+:}.

On peut également appliquer bien d'autres transformations lorsque l'on accède à une variable de cette façon. En voici une liste sommaire :

  • ${variable:+texte} vaut texte si la variable n'est pas vide et ne vaut rien sinon
  • ${variable:-texte} vaut la valeur de la variable si elle n'est pas vide, et texte sinon (en gros, ça fait de texte la valeur par défaut de variable)
  • ${variable:=texte} fait la même chose que ${variable:-texte}, mais modifie la variable si elle est vide
  • ${variable#préfixe} et ${variable##prefixe} renvoient la valeur de la variable privée respectivement des préfixes le plus court et le plus long qui correspondent au motif donné
  • ${variable%suffixe} et ${variable%%suffixe} agissent de la même façon que ${variable#…} et al., à partir de la fin de la variable
  • ${variable/recherche/remplacement} renvoie la valeur de la variable où recherche aura été remplacée par remplacement à la première occurence
  • ${variable//recherche/remplacement} remplace toutes les occurences de recherche par remplacement
  • ${variable,}, ${variable,,}, ${variable^} et ${variable^^} mettent la variable respectivement en minuscules et en majuscules, sans changer les autres caractères. Avec un seul suffixe, cela transforme le premier caractère de la chaîne. Avec deux suffixes, cela transforme toute la chaîne.

Ne fuyez pas tout de suite, tout est plus compréhensible avec des exemples. Vous pouvez copier-coller ce code dans votre terminal pour voir ce que tout celà ceut dire :

cat > script.sh <<EOF
foo=a/b.E/C.d
echo foo="\$foo"
echo '\${foo#*/}'="\${foo#*/}"
echo '\${foo##*/}'="\${foo##*/}"
echo '\${foo%.*}'="\${foo%.*}"
echo '\${foo%%.*}'="\${foo%%.*}"
echo '\${foo/./_}'="\${foo/./_}"
echo '\${foo//./_}'="\${foo//./_}"
echo '\${foo^^}'="\${foo^^}"
echo '\${foo,,}'="\${foo,,}"
EOF
bash script.sh

Trucs et astuces

Changer la disposition du clavier

Attention: Depuis Ubuntu 13.10, la disposition du clavier peut aléatoirement revenir en QWERTY à chaque fois que les système redémarrent. La section qui suit permet de rétablir l'agencement initial si cela vous arrive sur nos machines.

Comme presque tout sous Linux, on peut changer la disposition du clavier depuis la ligne de commandes, en utilisant le programme setxkbmap (“Set X KeyBoard Map”). Par exemple, pour passer en QWERTY, on écrit

setxkbmap en

Pour repasser en AZERTY, il suffit de taper

setxkbmap fr

Alternativement, on peut utiliser IBus, la technique Ubuntienne de changement des langues du clavier. Avec IBus, passer en Azerty se fait de la façon suivante :

ibus engine xkb:fr::fra

et repasser en Qwerty se fait avec

ibus engine xkb:us::eng

FIXME Compléter cette page (problèmes courants)

salles/linux.txt · Dernière modification: 2016/03/14 17:33 (modification externe)