[gull] Truc et astuces: bash connector

felix felix at f-hauri.ch
Thu Feb 15 21:27:22 CET 2018


On Thu, Feb 15, 2018 at 09:01:27PM +0100, felix wrote:
> > Surtout quel est le problème que cette méthode résoud, et quelle est l’idée 
> > centrale de la méthode?
> 
> Eliminer les ``forks'' répétitifs qui peuvent être évités.
> ...
>   $ ps --sid $(ps ho sid $$) fw
>     PID TTY      STAT   TIME COMMAND
>    4625 pts/2    Ss     0:00 -bash
>    9146 pts/2    S      0:00  \_ /usr/bin/bc -l
>    9150 pts/2    S      0:00  \_ /bin/date -f - +%s
>    9188 pts/2    R+     0:00  \_ ps --sid 4625 fw

J'allais oublier:

Tant qu'à faire de systématiser les dialogues avec des sous-tâches,
la suite serait le *connecteur de DB*, avec la possibilité de se
connecter à une base mysql, postgresql ou sqlite pour manipuler
des tables (temporaires ou non) en plusieurs étapes (voire l'exemple
qui utilise sqlite3: `# apt install sqlite3`).

  $ bash shell_connector.sh

Ce script génère 4 sorties:
Un `df -k` avec la colone `%` recalculée, plus le calcul d'une ligne `Total`.

  /dev                       devtmpfs    0.00K    7.81G        0%    0.00%
  /run                       tmpfs      57.47M    1.56G        4%    3.59%
  /                          ext4       49.25G   74.23G       67%   66.35%
  ...
  Total                                 49.34G  104.11G

un `ls -ltr` via `ls -l` et sqlite pour le tri par date, ainsi qu'un
calcul de la taille en ``lisible par humain'' avec 2 décimales, la
ligne `Total` contient une somme calculée par `bc` et une autre par `SQL`.

  perms        user                     date       size  name
   -rw-r--r--  felix        2018-02-14 17:59     7.93Kb  shell_connector.sh
   -rw-r--r--  felix        2018-02-15 20:17    12.14Kb  scTestFile.raw.gz
                    by bc:  20.07Kb,   by sql:  20.07Kb  Total

La date courrante à une seconde près,

  Last SQL read : jeu 15 fév 21:09:20
  now by date   : jeu 15 fév 21:09:20
  now by bash   : jeu 15 fév 21:09:20

Et enfin le résultat de la commande `ps --sid $(ps ho sid $$) fw`:

    PID TTY      STAT   TIME COMMAND
   6381 pts/1    Ss     0:00 -bash
   6392 pts/1    S+     0:00  \_ bash shell_connector.sh
   6396 pts/1    S+     0:00      \_ /usr/bin/bc -l
   6401 pts/1    S+     0:00      \_ /bin/date -f - +%s
   6406 pts/1    S+     0:00      \_ /usr/bin/sqlite3 -separator ? -header /dev/shm/test.sqlite
   6414 pts/1    R+     0:00      \_ ps --sid 6381 fw

Voire le script, repérer les lignes contenant `mySqlite` on `SQLIN`:

En gros:

  newSqlConnector $SQLITE "-separator $'\t' -header /dev/shm/test.sqlite"

  cat >&$SQLIN <<-EOSQLInit
        DROP TABLE IF EXISTS files;
        CREATE TABLE files (perms, user, date UNSIGNED BIGINT,
                size UNSIGNED BIGINT,name);
        EOSQLInit

  ...
  while read perm blk user group size month day yot name;do
    ...
    echo >&$SQLIN "INSERT INTO files values('$perm','$user',$Date,$size,'$name');"
  done < <(LANG=C /bin/ls -l|tail -n+2)

  mySqlite myarray "SELECT * from files order by date;"

  for line in "${myarray[@]}";do
    IFS=$'\t' read perm user date size name <<<"$line"
    ...
  done

  mySqlite stot 'SELECT SUM(size) FROM files;'


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


More information about the gull mailing list