FAQ

Bash, script, shell, Unix, … Si tout cela n’a aucun sens pour vous, vous êtes dans la bonne page !


Bash

Sous Unix, un shell est l’interpréteur de commandes qui fait office d'interface entre l'utilisateur et le système d’exploitation.
Les shells sont des interpréteurs, c’est-à-dire que chaque commande saisie par l’utilisateur (ou lue à partir d’un fichier) est syntaxiquement vérifiée puis exécutée.

Bash (Bourne-Again Shell) est le shell le plus courant sur Unix et possède un double aspect :
  • c’est un environnement de travail où l’on peut, entre autres, gérer les processus, modifier le texte de la commande courante, initialiser les variables de configuration (PATH, HOME, etc.)
  • c’est également un langage de programmation (qui intègre donc des notions de variable, de structure de contrôle, de fonction, d’opérateur arithmétique, …) avec ses propres spécificités.

  • Syntaxe d’une commande UNIX :
      [/chemin]
      nom_commande
      [-options]
      [fichier(s) ou répertoire(s)]

    Un script bash est un fichier de type texte contenant une suite de commandes shell, exécutables par l'interpréteur (ici le programme /bin/bash, spécifié au début de chaque script).

    NB :

  • Pour retrouver des informations sur les commandes via le shell :
    $
    man
    nom_commande (puis taper sur espace pour faire défiler les sections)
  • Si l’on veut seulement voir les différentes options possibles pour une commande :
    $
    nom_commande
    -h
    (ou
    --help
    )

  • ______________________________________________________________

    Commandes de base

    Par ordre alphabétique :

  • cat
    fichier :
    permet de lire un fichier ligne par ligne. Si un fichier de sortie est spécifié par un chevron (commande du type
    cat
    fichier_in > fichier_out), chaque ligne du fichier d'entrée sera "lue" et stockée dans le fichier de sortie spécifié (ce qui permet de concaténer plusieurs fichiers textuels, par exemple).

  • cd
     chemin (relatif ou absolu, selon où l’on se trouve à ce moment-là) :
    permet de se déplacer dans les répertoires.
    (. est le répertoire courant ;
    cd
    .. remonte d’un cran ; ../.. remonte de deux crans ; etc.).

  • echo
     " " :
    affiche le contenu se trouvant entre guillemets.

  • for
    élément
    in
     ensemble
    {
    instructions
    }
    :
    boucle qui effectuera les instructions données pour chaque élément de l'ensemble défini.

  • head -n
    X fichier |
    tail
    -Y :
    combinées, ces deux commandes signifient "affiche le contenu du début du fichier à partir de la ligne X ; et ne garde que Y ligne(s)" (si Y=1, cette combinaison bien pratique permet de n'afficher qu'une seule ligne précise d'un petit fichier de texte).

  • if
    condition
    then
    action à exécuter :
    structure de condition ; par défaut,
    if
    effectue l'action indiquée si la condition renvoie un code retour 0 (est vraie).
      else
      action à exécuter :
      alternative si la condition du premier
      if
      n'est pas remplie.

      elif
      condition2
      then
      action2 à exécuter :
      rajoute une nouvelle condition alternative (similaire à
      else if
      ).

      fi
      :
      pour terminer la structure
      if
      .

      -s
      fichier :
      option qui renvoie une valeur VRAIE si un fichier existe et a une taille de plus de 0.

      -n
      $variable ou string :
      option qui renvoie une valeur VRAIE si la chaîne de caractères n'est pas de longueur 0.

  • ls
     chemin :
    liste les fichiers contenus dans un répertoire (si rien n’est précisé, le répertoire courant).
  • mkdir
    (make directory) :
    permet de créer un répertoire.
      -p
       :
      ne considère plus comme une erreur la présence d'un dossier qu'on essaie de lui faire créer.

  • read
    chemin variable :
    affecte le nom d’un chemin à la variable.

  • rm
     fichier ou dossier :
    supprime les fichiers/dossiers spécifiés.
      -r
      ou
      -R
      :
      permet d'effacer récursivement les sous-répertoires.

      -f
      :
      ne considère plus comme une erreur l'absence d'un dossier ou d'un fichier qu'on essaie de lui faire supprimer.

  • sh
     nom_script.sh :
    permet d’éxecuter un script bash dans le shell.

  • sort
    fichier :
    permet de trier les lignes d'un fichier.
      -u
      :
      permet de n'afficher que la première séquence de lignes considérées comme égales (dans notre script, ne garder qu'une seule fois l'encodage s'il a été récupéré en plusieurs occurrences).

  • ______________________________________________________________

    Commandes spécifiques

    Wget

    Cette commande appelle un logiciel de téléchargement de pages Web (sans interaction avec l’utilisateur) qui permet de sauvegarder localement et à l’identique le contenu d’une URL.
    Ce logiciel supporte différents protocoles comme HTTP, HTTPS et FTP.
    Si un téléchargement échoue suite à un problème réseau, il réessayera jusqu'à ce que l'intégralité du fichier soit téléchargée.
    Si le serveur supporte la reprise, il lui demandera de reprendre là où le téléchargement s'est interrompu.

    Syntaxe de la commande :
      wget
      [-option(s)]
      [URL]

    Options utilisées dans notre script :
      -O
      fichier :
      Ecriture en sortie du contenu de la page Web dans fichier (peut être précédé d’un chemin).
      ! Attention ! Si fichier existe déjà, il sera remplacé.

    Exemple :
      Syntaxe de wget
    Pour plus d’informations…

    _______________________

    Lynx

    C’est un navigateur en ligne de commandes qui fonctionne en mode texte. L’intérêt de ce navigateur est de pouvoir mieux manipuler le contenu textuel d’une page Web.

    Syntaxe de la commande :
      lynx
      [-option(s)]
      [chemin ou URL]

    Options utilisées dans notre script :
      -dump
      page_web.html > dump_texte.txt :
      permet de rediriger le contenu textuel de la page vers un fichier texte. L’input peut très bien être une adresse URL, mais pour notre projet, nous avons déjà aspiré les pages en local (avec wget).
      -nolist
      :
      permet de supprimer les liens présents dans la page Web.
      --display_charset=
      nomMIME :
      permet de choisir l’encodage voulu pour l’affichage des caractères.

    Exemple :
      Syntaxe de lynx
    Pour plus d’informations…

    _______________________

    Egrep

    Affiche les lignes correspondant à un motif, donné sous forme d’expression régulière. Elle nous permet donc de filtrer le texte et de ne garder que le contexte voulu.
    ! Attention ! Le contexte est défini en nombre de lignes et non en nombre de mots.

    Syntaxe de la commande :
      egrep
      [-option(s)]
      'motif' [fichier]

    Options utilisées dans notre script :
      -A
      num :
      affiche le nombre de lignes supplémentaires après la ligne correspondante.
      -B
      num :
      affiche le nombre de lignes supplémentaires avant la ligne correspondante.
      -i
      :
      permet d’ignorer la casse (différences majuscules/minuscules).
      -q
      :
      Silence. Ne pas afficher les résultats normaux (rien n’est affiché dans la console si egrep fonctionne).
      -o
      :
      permet d’afficher seulement le motif recherché.
      -m
      num :
      permet de n’extraire que la xième ligne voulue où l’occurrence du motif est trouvée.

    Exemple :
      Syntaxe de egrep
    Pour plus d’informations…

    _______________________

    Sed

    C'est un éditeur de flux qui permet la transformation de texte. Associé à la commande
    s
    /…/…/, il permet de substituer une chaîne de caractères par une autre.

    Syntaxes de la commande :
      sed
      [-option(s)]
      '
      s
      /cdc_à_remplacer/par_celle_ci/
      flags
      '

    Options utilisées dans notre script :
      -r
      :
      permet d’utiliser des expressions régulières.
      -e
      :
      permet d’ajouter un script aux commandes à exécuter.

    Flags utilisés :
      g
      :
      permet le remplacement de la chaine de caractères donnée pour toutes les occurrences trouvées dans le texte.
      i
      :
      permet d’ignorer la casse.

    Remarque :
  • On peut modifier les séparateurs "/" par ‘#’, lorsque l’on utilise "/" dans les chaînes de caractères à trouver ou à remplacer pour éviter de le despécialiser :
    sed
    '
    s
    #cdc à remplacer#par celle-ci#
    gi
    '
  • Pour utiliser le contenu d'une variable comme chaîne de caractères, on l’entoure de guillemets doubles au lieu des guillemets simples.
    Dans notre cas, nous avons également dû ajouter des guillemets simples autour de la variable (pour des raisons encore inconnues !)
    sed
    '
    s
    #'"$variable"'#à remplacer_par'"$variable"'#
    ig
    '

  • Exemple :
      Syntaxe de sed
    Pour plus d’informations…

    _______________________

    Iconv

    C'est un programme qui convertit un texte d'un encodage vers un autre.

    Syntaxe de la commande :
      iconv
      [option(s)]
      [fichiers d'input et d'output]

    Options utilisées dans notre script :
      -f
      (
      --from charset
      ) :
      spécifie l'encodage du fichier d'entrée.
      -t
      (
      --to charset
      ) :
      spécifie l'encodage du fichier de sortie.
      -c
      :
      ne pas traîter les caractères non reconnus plutôt que de renvoyer une erreur de conversion.

    Exemple :
      Syntaxe de iconv
    Pour plus d’informations…

    ______________________________________________________________

    Astuces

    Une liste non exhaustive de petits trucs qui peuvent toujours servir !

    Comment ne plus taper un chemin ?

  • Modifier les propriétés de Cygwin pour qu'il accepte le mode d'édition rapide (cliquer droit sur la fenêtre ; aller dans 'propriétés', puis dans l'onglet 'options' et cocher la case « mode d’édition rapide »)
  • Copier l’adresse de la barre de navigation du répertoire voulu (sous Windows).
  • Avec un clic droit, le coller dans Cygwin sans oublier de mettre l’adresse copiée entre guillemets (puisque syntaxe des chemins différente sous Unix).
  • Taper sur Entrée…
  • C’est magique !

  • Pourquoi mon script ne marche pas chez moi ? (mais pourtant très bien à l’ILPGA !)

    Rentré(e) à la maison, le shell ne cesse de vous dire qu’il y a des problèmes de $‘\r’ dans votre script ? Cela vient du fameux problème de compatibilité des retours à la ligne entre Windows et Unix !
    Il vous faut donc utiliser un utilitaire aux effets extraordinaires :
      $
      dos2unix
      nomfichier.*
    Il convertira automatiquement un fichier encodé en format Windows en format Unix ! A noter que l'effet inverse est également possible, en appelant l'utilitaire
    unix2dos
    .
    Sinon, vous pouvez toujours écrire votre script dans un éditeur de texte plus intelligent (comme Notepad++ par exemple), qui possède un outil de conversion intégré (menu "Format").

    Comment ça, "Command not found" ???

    Ce qu’installe Cygwin lors de l’exécution du setup n’est pas la version « complète » : il y manque un certain nombre de modules qui doivent être installés manuellement par la suite si besoin est.
    Si vous êtes dans cette situation, voici la procédure à suivre :
  • Relancer le setup de Cygwin
  • Choisir l’installation depuis le téléchargement par Internet (Install from Internet)
  • Suivant/suivant/suivant/suivant/suivant
  • Dans la fenêtre, cliquer sur le bouton "View" (en haut à droite) une fois pour être en mode Full (et donc avoir une liste complète), puis choisir le(s) package(s) (dernière colonne) correspondant à la(/les) commande(s) manquante(s).
  • Cliquer sur "Skip" (2ème colonne New) du ou des package(s) voulu(s) et continuer à cliquer jusqu’à avoir la version voulue de la commande (ou jusqu’à annuler en retombant sur "Skip"). Laisser la case de la colonne Bin ? cochée (fichier binaire).
  • Puis cliquer sur suivant pour démarrer l’installation !