[gull] Cours gull d'hier

Félix Hauri felix at f-hauri.ch
Sat Apr 6 18:28:46 CEST 2013


Bonjour,

On Wed, Apr 03, 2013 at 10:59:34AM +0200, Bastien Béguelin wrote:
> Et du coup, je me demandais si tu avais laissé une trace de tes trucs et
> astuces?

> (à savoir un petit LaTeX qui traine ou un fichier texte, qqc...:)
> 

C'était un cours un brin improvisé et sans trop de documentations.
J'espère que les participants n'ont pas été trop décus...

Quelque rafraichissment:

** bash et les entiers signés:
  Le bash utilise 64 bits pour les calculs en entiers:
  $ echo $(( -1 ^ -1 << 64 ))
  0
  $ echo $(( -1 ^ -1 << 63 ))
  9223372036854775807

  soit 18 chiffres significatifs. Cela laisse pas mal de place
  pour le positionnement d'une virgule...

** bash les forks et autre mauvais reflexes.
  De même que la syntaxe: 
  $ cat monFichier | grep maRegexp

  serait mieux écrite:
  $ grep maRegexp <monFichier

  il existe une quantité de moyen d'éviter les `fork' inutiles.

  Lors de mon précédent cours, j'avais présenté une fonction `percent'
  qui utilisait un fork sous la forme de `$()' et une condition inutile,
  de plus necessitait l'utilisation d'un fork pour récupérer sa réponse
  dans une variable:

  $ prct() {
      _dc_pr100k=$((${1}00000/$2));
      if [ ${#_dc_pr100k} -gt 3 ];then
          _dc_out=${_dc_pr100k:0:${#_dc_pr100k}-3}.${_dc_pr100k:${#_dc_pr100k}-3}
      else
          _dc_out=$(printf ".%03d" $_dc_pr100k)
      fi
      printf "%.2f%%\n" $_dc_out
      unset _dc_pr100k _dc_out
  }

  exemple:
  $ var=$(prct 123 456)   # Ca, c'est un fork!
  $ echo $var
  26.97%

  Cette fonction à été ré-écrite afin d'éviter les forks et tests:

  $ percent() {
      local p=000$((${1}00000/$2))
      printf ${3+-v} $3 "%.2f%%\n" ${p:0:${#p}-3}.${p:${#p}-3}
  }

  Elle peut donc être utilisés de la manière suivante:

  $ percent 234 567 var
  $ echo $var
  41.27%

** bash/Linux Utilisation de /proc pour suivre (espionner) l'évolution d'autres
  tâches.

  Pour cela j'ai tapé
  $ less /var/lib/upower/history-rate-42T4630-63-2311.dat

  pour avoir un **long** fichier ouvert dans un terminal, puis dans un autre,
  j'ai tapé:
  $ ps -C less
  ou
  $ pidof less

  puis
  $ /bin/ls -l /proc/22601/fd

  pour y voire que le process 22601 (less) à ouvert le fichier ``...2311.dat''
  avec le FD 4.
  Pour savoir où il en est:
  $ cat /proc/22601/fdinfo/4
  pos:   	8192
  flags:	0100000

  Donc, pour suivre l'évolution en ``temps réel'':
  $ pid=$(pidof less)
  $ while mapfile proc </proc/$pid/fdinfo/4 ;do
      percent ${proc//*$'\t'} 830287 var
      printf "\r%s " $var
      sleep .5
    done

  Enfin, faire évoluer la commande ``less'' dans la première fenêtre pour suivre
  l'évolution dans la seconde.

 * Deux mots d'explication concernant la syntaxe: `${proc//*$'\t'}'
  Il s'agit d'une substitution de variable, comme:
  `#' qui sert à supprimer du début de chaine jusqu'ou premier `l' ou
  `##' qui sert à supprimer du début de chaine jusqu'ou dernier `l'.
  $ mavariable="Salut les amis"
  $ echo ${mavariable#*l}
  ut les amis
  $ echo ${mavariable##*l}
  es amis
  `%' et `%%', pareil, mais pour la fin de ligne:
  $ echo ${mavariable%l*}
  Salut
  $ echo ${mavariable%%l*}
  Sa

  La syntaxe ${mavariable/In/Out} remplacera `In` par `Out`:
  $ echo ${mavariable/les/mes}
  Salut mes amis
  $ echo ${mavariable/les}
  Salut amis
  $ echo ${mavariable/les*}
  Salut

  Et donc, si ma chaine contient une tabulation (CHR 9), je peux ôter la
  partie de gauche en faisant:
  $ echo ${proc//*$'\t'}
  ou
  $ echo ${proc#*$'\t'}
  ou
  $ echo ${proc/*$'\t'}


** bash les substitution de processus (pipe inversés)
  La commande:
  $ seq 1 10 | wc
  peut être écrite:
  $ wc < <(seq 1 10)

  Cela permet d'utiliser des commandes en lieu et place de fichiers
  y compris pour des commandes telles que diff, join, paste:

  $ paste <(seq 11 15) <(seq 1 5)
  11      1
  12      2
  13      3
  14      4
  15      5

  Cela permet d'enviseager des trucs comme: ``rendre lisible les dates de squid'':
  $ mkfifo accesslogfifo
  $ sed 's/\t//' <(
      tee accesslogfifo </var/log/squid/access.log |
          paste <(
              date -f <(
                  sed -ne 's/^\([0-9]\+\)\..*$/1970-1-1 UTC +\1 secs/p'
                ) "+%a %d %b %T"
            ) <(
              sed -ne 's/^[0-9]\+\././p' <accesslogfifo
            )
        )

  (Nota: ceci est plus facile et plus rapide en perl ;-)
  $ perl -MPOSIX -pe 's/^([0-9]*)\./strftime("%a %d %b %T.",localtime($1))/e' \
      </var/log/squid/access.log

** bash variables indirectes
  $ a=5
  $ b=a
  $ echo $b
  a
  $ echo ${b}
  a
  $ echo ${!b}
  5

** bash ``jusqu'où s'arreteront-ils?'' (-Coluche-)
  Ceci soulève la question: A quel moment le bash doit laisser place à un autre
  language.

  Ma réponse est relativement simple: A partir du moment où l'on commence
  à faire des algorithmes!

  Mais égallement, lorsqu'un ``script'' commence à faire plus de 30 lignes,
  celui-ci commence à devenir un ``programme''.

  Surtout: tant que le temps d'éxecution est favorable en bash, alors on
  peut s'en contenter.

** bash bashismes pas finis
  Certains bashismes sont tellement arbitraires et en-cascadés que l'on ne
  sais plus trop de quelle manière les utiliser.
  Cela ressemble un peu à des tentatives à tout faire, mais raremenent
  opportun ou/et abouti.

  $ echo {1..9} {A..z}
  1 2 3 4 5 6 7 8 9 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ 
  ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z

  mais alors pourquoi:
  $ echo { ..@}
  { ..@}
  $ echo { ..\@}
  { ..@}
  $ echo { ..A}
  { ..A}
  $ echo {+..A}
  {+..A}
  $ echo {1..A}
  {1..A}

  ... et bien sûr:
  $ a=5
  $ echo {0..a}
  {0..a}
  $ echo {0..$a}
  {0..5}

  Cela ne marche pas du tout!

  Avec les chaines localisées égallement, ce n'est pas le pied:
  $ export TEXTDOMAIN=coreutils
  $ echo $"system boot"
  démarrage système

  Ça, c'est chouette, mais:
  $ echo $"Written by %s, %s, %s,
  and %s.
  "
  Écrit par %s, %s, %s,
  et %s.

  Ne peut pas être écrit autrement:
  $ echo $"Written by %s, %s, %s,\nand %s.\n"
  Written by %s, %s, %s,\nand %s.\n

  Donc impossible à placer proprement dans un script indenté.

** autres truc et astuces
  Certains sur mon site sont mis à jour:

 - elap-bash à sourcer avec l'option `trap`, fonctionne différement
  selon qu'il est chargé dans un shell interactif ou non.
  http://www.f-hauri.ch/vrac/cours_truc-et-astuces_2012-04-03/add/elap.bash-v2
  et
  http://www.f-hauri.ch/vrac/cours_truc-et-astuces_2012-04-03/add/elap.test-v2

 - Disk-Free 2 Pies on desktop: un petit bash qui génére des tartes au svg:
  http://www.f-hauri.ch/vrac/cours_truc-et-astuces_2012-04-03/dfpie.sh

** encore d'autre truc et astuces
  Depuis quelque temps, je me suis inscript sur `stackoverflow.com', afin
  d'y partager des idées et points de vues (Ceci explique égallement que le
  flux de T&A ait diminué sur la présente liste.)

  Ce site de question-réponse collaboratif utilise la licence Creative-Common
  pour les post qui y figurent...

  La langue d'usage est bien entendu l'anglais.

  Vous y trouverez quelques sujets comme:

 ** créer une tâche screen **sans console**, mais attachable, avec une
   disposition complexe des fenêtres... et des variables privées.

   http://superuser.com/questions/525573/how-can-bash-screen-be-setup-in-the-background-and-brought-to-the-front-later/525647#525647

   J'en suis assez content. Je l'ai fait pour répondre à la question, mais
   depuis, je l'utilise.

 ** Quelque considération à propos de `2>&1` `1>&2`, etc.
   Avec des démonstrations pratiques.

   http://stackoverflow.com/questions/818255/in-the-bash-shell-what-is-21/14195276#14195276

 ** Pour Bastien, qui demandais du LaTeX, il y a là, un script qui prépare un fichier
   LaTeX pour imprimer un répertoire sous forme d'arbre-table-des-matières avec
   numéros de pages, et met en forme les contenu du répertoires, fichier texts et
   images.:

   http://unix.stackexchange.com/questions/58372/shellscript-to-print-a-directory-tree-and-filess-contents-with-a-nice-presentat/61072#61072

   (voire le 2ème exemple, avec les images, TOC et donc, 2 passages)

Pour voire mes posts:

  http://stackoverflow.com/search?q=user%3A1765658
  http://security.stackexchange.com/search?q=user%3A15701
  http://unix.stackexchange.com/search?q=user%3A27653
  http://superuser.com/search?q=user%3A178656
  http://serverfault.com/search?q=user%3A142978

Il faut être loggué (et obtenir un minimum de réputation) pour voter...
Venez voter pour mes posts si vous les trouvez utiles!

Voilà, toujours dans l'espoir d'être plus utile que pénible...

P.S. Je publie moins sur cette présente liste car j'ai le sentiment qu'elle
est moins lue... Si je me trompe, faites-le moi savoir!

--
 Félix Hauri  -  <felix at f-hauri.ch>  -  http://www.f-hauri.ch


More information about the gull mailing list