Exile on Keyboard St. - Blog sur Linux et Debian

Aller au contenu | Aller au menu | Aller à la recherche

vendredi 7 avril 2017

Bien utiliser les tableaux en bash

Le bash, Bourne Again Shell, offre une possibilité absente du Bourne Shell, à savoir la possibilité de déclarer facilement des tableaux.

On s'intéressera ici aux tableaux indexés uniquement.

Pour déclarer un tableau, rien de plus simple:

#!/bin/bash

colours=(black blue green white red yellow)

Maintenant pour afficher tous les éléments en une fois:

echo "colours_elements=${colours[@]}"

colours_elements=black blue green white red yellow

Pour afficher la troisième couleur, située à l'indice 2:

echo "green=${colours[2]}"
green=green

Le nombre d'élements du tableau:

echo "colours_count=${#colours[@]}"
colours_count=6

Pour boucler sur chaque valeur:

for colour in ${colours[@]}; do
    ...
done

Et pour afficher la troisième couleur en partant de la fin du tableau:

echo "${colours[-3]}"
white

Enfin bash permet aussi de lire un fichier dans un tableau avec la built-in mapfile.

samedi 8 août 2015

Attention aux built-in et aux variables spécifiques à bash

On lit ça et là que pour vérifier si l'utilisateur courant est root il faut utiliser la variable UID ou EUID en procédant comme suit:

if [ $EUID -ne 0 ]; then
   echo "This script must be run as root" 1>&2
   exit 1
fi

malheureusement en omettant de préciser que ces variables sont spécifiques à bash et donc utilisable à condition d'avoir bash sur la machine et d'avoir explicitement demandé à l'utiliser.

En effet, depuis que la plupart des environnements Linux ont bash comme Shell par défaut, les développeurs semblent vouloir écrire chaque script forcément en bash. Cette intention est louable pour profiter de la puissance de ce Shell, mais rendra le script inutilisable dans un environnement dépourvu de bash et/ou si le Shebang n'est pas positionné correctement.

Par conséquent, si l'on souhaite écrire des scripts Shells portables, il faut bien prêter attention aux built-in et variables de bash qui seraient absentes sur sh.

mercredi 23 avril 2014

La commande kill sous Linux

Lorsqu'un processus devient récalcitrant sous Linux, il y a des cas où cesser son activité est la seule solution.

On utilise alors la commande kill de Linux qui prend en paramètre le (ou les) pid des processus à arrêter.

Par exemple:

kill 1289

Mais quel signal envoie kill ? Par défaut la commande kill envoie le signal SIGTERM (qui vaut 15) pour demander gentiment au processus de bien vouloir s'arrêter.

La commande précédente est donc équivalente à:

kill -15 1289

On peut aussi l'écrire en utilisant les noms de signaux comme suit:

kill -TERM 1289

ou

kill -SIGTERM 1289

Si un processus refuse de s'arrêter avec le signal SIGTERM on utilise alors SIGKILL (qui vaut 9):

kill -9 1289

Et si j'ai besoin de la liste des signaux disponibles et de leur valeur numérique:

kill -l

qui affiche:

 1) SIGHUP       2) SIGINT       3) SIGQUIT      4) SIGILL       5) SIGTRAP
 6) SIGABRT      7) SIGBUS       8) SIGFPE       9) SIGKILL     10) SIGUSR1
11) SIGSEGV     12) SIGUSR2     13) SIGPIPE     14) SIGALRM     15) SIGTERM
16) SIGSTKFLT   17) SIGCHLD     18) SIGCONT     19) SIGSTOP     20) SIGTSTP
21) SIGTTIN     22) SIGTTOU     23) SIGURG      24) SIGXCPU     25) SIGXFSZ
26) SIGVTALRM   27) SIGPROF     28) SIGWINCH    29) SIGIO       30) SIGPWR
31) SIGSYS      34) SIGRTMIN    35) SIGRTMIN+1  36) SIGRTMIN+2  37) SIGRTMIN+3
38) SIGRTMIN+4  39) SIGRTMIN+5  40) SIGRTMIN+6  41) SIGRTMIN+7  42) SIGRTMIN+8
43) SIGRTMIN+9  44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9  56) SIGRTMAX-8  57) SIGRTMAX-7
58) SIGRTMAX-6  59) SIGRTMAX-5  60) SIGRTMAX-4  61) SIGRTMAX-3  62) SIGRTMAX-2
63) SIGRTMAX-1  64) SIGRTMAX    

Vous noterez un résultat légèrement différent en utilisant /bin/kill -l. En effet kill -l utilise en fait la built-in kill de bash.

On peut aussi utiliser /bin/kill -L. Cette dernière option n'existant pas dans la built-in.

C'est également bash qui vous proposera la liste des pids des processus tournant sur votre système lorsque vous entrez kill puis un espace puis appuyez sur la touche Tabulation:

$ kill 
Display all 161 possibilities? (y or n)
1     137   142   1475  152   19    2064  2240  2316  2379  2453  26    2622  2679  2699  2713  2748  2781  2828  2861  30    3147  3215  3367  381   3904  609   
10    138   144   1476  153   194   2084  2268  2319  2384  2457  2617  2665  2684  27    2714  2760  2790  2847  2862  3068  3156  3229  3369  3860  3908  619   
101   139   145   1477  16    2     2104  2269  2341  2388  25    2618  2666  2688  2701  2721  2773  2792  2856  2865  3097  3167  3242  3420  3879  3909  7     
12    14    1472  15    17    20    2151  2286  2342  24    2534  2619  2669  2690  2704  2724  2775  2812  2857  2873  3102  3175  3250  3480  3880  3910  724   
122   140   1473  150   18    2017  2169  23    2373  245   2562  2620  2670  2695  2705  2728  2777  2814  2858  2974  3123  3183  3261  3493  3883  536   8     
13    141   1474  151   1800  205   22    2303  2378  2450  2587  2621  2671  2696  2708  2729  2780  2825  2859  3     3128  3191  3275  3546  3893  6