Differences between revisions 14 and 15
Revision 14 as of 2010-07-06 12:39:13
Size: 12015
Comment: À l'aide ! une idée pour remplacer "L'anti-guillemet ``" ???
Revision 15 as of 2010-07-06 12:40:19
Size: 12037
Comment:
Deletions are marked like this. Additions are marked like this.
Line 12: Line 12:
'''État : ''' {traduc} '''État : ''' {traduc} (50% environ de fait)

État : {traduc} (50% environ de fait)

Retour au document principal

La ligne de commande

Pré-requis

  • Aucun

Objectifs

  • Introduction au shell bash et aux concepts de base comme l'éxécution interactive de programmes
  • Distinguer les variables locales et globales (exportées)
  • Manipuler les données à partir des tubes et des autres opérateurs de redirection
  • Comprendre les caractères de substitution

Présentation

La ligne de commande est un moyen simple d'interagir avec un ordinateur. Le shell interprète les commandes tapées au clavier. Le prompt, ou l'invite de commande, qui se termine par un $ ou un # pour l'administrateur, indique que le shell attend les commandes de l'utilisateur.

Le shell est également un langage de programmation qu'on peut utiliser pour lancer des tâches automatiquement. Les programmes shell sont appelés des scripts.

Shells les plus courants

Le Bourne shell

/bin/sh

Le "Bourne again" shell

/bin/bash

Le Korn shell

/bin/ksh

Le C shell

/bin/csh

Tom's C shell

/bin/tcsh

le programme du LPI se concentre essentiellement sur le Bash, puisque c'est l'un des shells les plus courammant utilisés.

Le shell interactif

Les commandes shell suivent généralement la syntaxe suivante :

commande [options] {paramètres}

Afficher du texte à l'écran

Le bash utilise la commande echo pour afficher du texte à l'écran :

echo “Voici une courte ligne.”

Chemins relatif et absolu

Le shelle interprète le premier "mot" de toute chaîne de caractère donnée comme une commande. Si cette chaîne est un chemin relatif ou absolu vers un fichier exécutable, alors le programme est exécuté. Si ce prmier mot n'est pas précédé de /, alors le shell recherchera dans les répertoires définis dans la vatiable PATH et tentera de lancer la première commande qui correspondra à la chaîne.

Par exemple, si la variable PATH contient les répertoires /bin et /usr/bin, alors le système ne trouvera pas la chaîne xeyes puisque xeyes se trouve dans /usr/X11R6/bin/xeyes. Dans ce cas, vous devez entrer le chemin absolu de la commande :

/usr/X11R6/bin/xeyes

Mais on peut également utiliser le chemin relatif. Par exemple, si l'utilisateur est dans le répertoire où se trouve le programme xeyes, il peut taper :

./xeyes

Variables

Les variables du shell sont équivalentes aux variables utilisées dans les langages de programmation. Les noms de variables ne doivent contenir que des caractères alphanumériques. Par exemple, CREDIT=300 assigne tout simplement la valeur 300 à la variable nommée CREDIT.

Shell variables are similar to variables used in any computing language. Variable names are limited to alphanumeric characters. For example CREDIT=300 simply assigns the value 300 to the variable named CREDIT.

  1. initialiser une variable : Nom_Variable=valeur (sans espace !)

  2. appeler une variable : $Nom_Variable

CREDIT=300
echo $CREDIT

On peut supprimer la valeur d'une variable avec la commande unset.

export, set et env

Il y a deux types de variables : les variables locales et les variables globales (exportées).

Les variables locales ne sont accessibles que sur le shell actif. Les variables exportées ou globales sont accessibles à la fois par le shell actif et par tous les processus fils lancés à partir de ce shell.

Local variables will be accessible only to the current shell. On the other hand, exported variables are accessible by both the shell and any child process started from that shell.

Les commandes set et env listent les variables définies.

Les commandes set et env

set

Liste toutes les variables

env

Liste les variables exportées

Une variable globale est globale dans le sens où elle est accessible par tous les processus fils.

Variable locale

Variable locale

Parent

Fils

Parent

Fils

VAR=val

VAR=?

VAR=val

VAR=val

Exemple : exportez la variable CREDIT puis testez si elle est listée par set ou env.

export CREDIT
env | grep CREDIT

Lancez un nouveau shell (processus fils) (NdT : en tapant bash) et vérifiez que la variable CREDIT est accessible. Peut-on lancer n'importe quel SHELL et être sûr que la variable CREDIT est toujours déclarée ?

Liste de variables courantes pré-définies :

Variable pré-définie

Signification

DISPLAY

Utilisé par X pour identifié iù lancer une application cliente

HISTFILE

Chemin vers le fichier utilisateur .bash_history

HOME

Répertoire personnel de l'utilisateur

LOGNAME

Identifiant de connexion de l'utilisateur

PATH

Liste des répertoires utilisés par le shell pour exécuter des programmes quand une commande est entrée dans chemin

PWD

Répertoire de travail actuel

SHELL

Shell utilisé (bash dans la plupart des distributions Linux

TERM

 Émulation de terminal utilisée

Variables spéciales

Les variables suivantes sont relatives à la gestion des processus :

Variable

Signification

$!

PID du dernier processs fils

$$

PID du shell actif

$?

valeur de sortie de la dernière commande : 0 = succès, 1 sinon

Entrées, sorties et redirections

Les processus UNIX ouvrent trois descripteurs de fichiers standards (NdT : correspondant aux flux standards) qui permettent de traiter les entrées et sorties. Ces descripteurs standars peuvent être redéfinis pour chaque processus. Dans la plupart des cas, le descripteur stdin (entrée standard) est le clavier, et les deux descripteurs de sortie, stdout (sortie standard) et stderr (l'erreur standard), sont l'écran.

Un processus et ses 3 descripteurs de fichiers

STDIN < ------ PROCESSUS ---- >
                   |     ---- >>  STDOUT
                   |     ---- | 
                   |
                  2>
                STDERR

Valeurs numériques pour stdin, stdout et stderr

flux

Valeur numérique

stdin

0

stdout

1

stderr

2

Redirection de la sortie standard

programme > fichier

Les données vont de gauche à droite.

fdisk –l > partitions.txt  

Ceci lance fdisk et redirige la sortie vers le fichier partitions.txt. La sortie n'est pas visible a l'écran. Notez que le shell lit cette commande à partir de la droite : le fichier partitions.txt est d'abord créé s'il n'existait pas auparavant, écrasé dans le cas contraire car l'opérateur ">" est utilisé.

L'opérateur ">>" ajoute la sortie standard à un fichier.

Redirection de la sortie standard :

          ----  > ----
PROCESSUS ---- >> ---- FICHIER / PÉRIPHÉRIQUE
          ---- 1> ----

Redirection de l'entrée standard

programme < fichier

Dans ce cas, les données vont de droite à gauche. L'opérateur "<" ne peut être utilisé qu'avec stdin donc on ne peut pas l'utiliser avec les flux de sortie.

Si le fichier contient les instructions p, m et q (une instruction par ligne), alors dans l'exemple suivant fdisk affichera la table des partitions de /dev/hda, puis affichera l'aide puis quittera :

fdisk /dev/hda  < instructions 

Redirection de l'entrée standard :

PROCESSUS ---- <  ---- FICHIER / PÉRIPHÉRIQUE
          ---- 0< ----

Redirection de l'erreur standard

programme 2> fichier_erreur

stdin, stdout et stderr sont représentés respectivement par 0, 1 et 2. Cela nous permet de choisir le flux d'erreur standard :

find / 2> /dev/null

Redirection de l'erreur standard :

PROCESSUS ---- 2> ---- FICHIER / PÉRIPHÉRIQUE

Les tubes

programme1 | programme2

Les tubes sont représentés par l'opérateur "|". Les données vont de gauche à droite. La figure suivante indique comment la sortie standard su premier processus est redirigée vers l'entrée standard du second processus.

Redirection à partir d'un tube :

PROCESSUS1 (stdout) ---- | ---- (stdin) PROCESSUS2

Exemple :

cat /var/log/messages | less                       

Note : Les redirections de sortie multiples sont analysées de droite à gauche, ainsi les commandes suivantes ne sont pas équivalentes :

commande  2>&1  > fichier
commande  >fichier  2>&1

La commande tee

commande | tee FICHIER

La commande tee est utilisé après un tube et prend comme paramètre un nom de fichier. La sortie standard de la commande précédente est alors écrite dans le fichier (NdT : comme avec ">") mais tee laisse le flux vers la sortie standatd. La sortie standard est dupliquée.

Métacaractères et guillemets

Les métacaractères ont un sens spécial pour le shell. Ils sont la plupart du temps utilisés comme jockers, pour correpondre à plusieurs noms de fichiers ou de répertoires en utilisant un minimum de lettres.

Les caractères d'entrée (<), de sortie (>) et le tube (|) sont également des caractères spéciaux ainsi que le dollar ($) utilisé pour les variables. Nous ne les listerons pas ici, mais notez que ces caractères sont rarement utilisés pour nommer des fichiers standards.

Caractères génériques ou jockers

  • Le caractère * remplace n'importe quel nombre de caractères :

ls  /usr/bin/b*

Liste tous les programmes commençant par "b".

  • Le caractère ? remplace n'importe quel caractère unique :

ls  /usr/bin/?b*

Liste tous les programmes ayant un "b" pour seconde lettre.

  • [] est utilisé pour définir une plage de valeurs :

ls  a[0-9]

liste tous les fichiers commençant par un "a" suivis d'un chiffre en seconde position.

ls  [!Aa]*

liste tous les fichiers qui ne commencent pas par un "a" ni par un "A"

  • {chaîne1,chaîne2}; même si ce n'est pas simplement un jocker de nom de fichiers, on peut l'utiliser pour filtrer des noms de fichiers :

ls  index.{htm,html}

Guillemets et caractères d'échappement

On peut annuler la signification des jockers en utilisant des caractères d'échappement, qui sont également des caractères génériques.

L'antislash (\), qu'on appelle le caractère d'échappement, annule le sens de tous les caractères génériques, en foçant le shell à les interpéter littéralement.

Les guillemets simples, ou apostrophes (' ') annule le sens de tous les caractères génériques sauf l'antislash.

Les guillemets (doubles) (" ") sont les guillemets faibles mais annulent la plupart des métacaractères entourés à l'exception du tube (|), de l'antislash (\) et des variables ($var).

L'anti-guillemet `` (??? voir le commentaire de la page)

Les anti-guillemets exécutent la commande entourée. L'exemple suivant définit la variable TIME à partir de la commande date.

TIME="La date d'aujourd'hui est le `date +%a:%d:%b`”
echo $TIME
La date d'aujourd'hui est le mar.:06:juil.

Pour exécuter des commandes, on peut également utiliser $(). La commande sera exécutée et traitée comme une variable.

TIME=$(date)
Heberge par Ikoula