Skip to content

Linux Attitude

Le libre est un état d'esprit

Archive

Tag: Scripting

Niveau :      
Résumé : perl

Perl fait beaucoup de choses, trop, tellement que certaines sont complètement inutiles

Il est possible de changer la numérotation des tableaux :

# le premier élément d'un tableau sera maintenant le numéro 42
$[=42;

Il est possible d'allouer de la mémoire inutilisée :

# alloue 64Mio de mémoire pour que perl puisse les utiliser quand il meurt a cause du manque de mémoire !!
# ce qui ne l'empêche pas de mourir bien sur
$^M=64<<20; 

Les sections BEGIN {} et END {} sont des blocs très utiles qui s'écrivent tels quel, mais il peuvent aussi être écrits comme des méthodes :

sub BEGIN {}

Perl disposes de modules en provenance du CPAN. Parmi ces modules on trouve les modules Acme, dont voici quelques exemples pour bien en comprendre l'utilité :

  • Acme::Anything qui permet de charger des modules qui n'existent pas
  • Acme::Error qui permet d'afficher toutes les erreurs en capitales.
  • Acme::Godot qui vous permet d'attendre Godot
  • Acme::EyeDrops pour convertir votre code perl en ascii art (fonctionnel en perl), très joli d'ailleurs
  • Acme::Code::Police supprime toute erreur de code qui n'utiliserait pas strict en supprimant le code.

Niveau :      
Résumé : .vimrc

Le retour du Jedi ! Les vacances sont finites, il est temps de de reprendre le dur cheminement dans le monde libre.

Après le vif succès du bashrc collaboratif, je vous propose de participer à un vimrc collaboratif. Le principe est le même, j'amorce le contenu d'un vimrc avec plein de petites choses utiles pour tous les jours, et vous complétez par des commentaires. Ceux-ci seront réintégrés avec votre nom dans l'article au fur et à mesure.

Attention, un guillemet double commence un commentaire :


continue reading...

Niveau :      
Résumé : perl

Quelques trucs et astuces de perlistes en vrac. Pour des vrais astuces de pro régulières, n'hésitez pas à visiter le site des moines de perl.

Initialiser un tableau de chaînes sans avec une syntaxe légère, très lisible quand on n'a que des mots, le séparateur étant les caractères blancs, incluant le retour à la ligne :

@tableau = qw( mot1 mot2 mot3 );

Passer du mode script de quelques lignes au mode développement long. Cela vous oblige à déclarer et initialiser toutes vos variables entre autre :

use strict;

Le debug facile :

use Data::Dumper;
# variable peut être n'importe quoi, toutes les sous-sous parties sont écrites :
print Dumper($variable,\@variable);
print Dumper(\%variable);

L'aide en ligne facile, ça fait tout de suite classe dans un script (format) :

use Pod::Usage;
# imprime le contenu de SYNOPSIS et termine le programme avec un code d'erreur 1
pod2usage(1);
# attention, pod est chatouilleux sur les retours à la ligne avant et après les =

=head1 SYNOPSIS

commande  [-o|--option=<valeur>]

=cut

La page de manuel facile (pas seulement le SYNOPSIS comme précédemment) :

# où fichier.pl est le code précédent
$ pod2man fichier.pl > fichier.1
$ man ./fichier.1

Et le dernier pour la route, le parsing d'options facile, très classe, surtout en combinaison avec pod2usage (format) :

use Getopt::Long;
my $options = {
        option => 'defaut'
};
GetOptions( $options, qw(
        option|o=s
));

Niveau :      
Résumé : tail -F ; ls | wc ; xmodmap ; bell-style ; /proc/sys/kernel/core_pattern

Lire un fichier au fur et a mesure qu'il est complété (par exemple un fichier de log) :

# -F bon réflexe pour les fichier qui peuvent être rotatés
$ tail -F fichier

Compter les entrées d'un répertoire sans se planter avec les noms spéciaux (espace ...) Perdre son temps

$ find . -maxdepth 1 -mindepth 1 -printf a | wc -c

Transformer votre souris en souris pour gaucher :

$ xmodmap -e "pointer = 3 2 1"

Supprimer les bips en bash :

$ set bell-style none

Transformer les bips en flash écran en bash :

$ set bell-style visible

Retour au comportement par défaut :

$ set bell-style audible

Faire apparaitre tous les core dump dans /tmp et non dans le cwd du processus :

# on en profite pour lui donner un nom unique <binaire>-<date>-<pid>.core
$ echo /tmp/%e-%t-%p.core > /proc/sys/kernel/core_pattern

Pour rendre cela persistant au reboot, écrire la ligne suivante dans /etc/sysctl.conf :

kernel.core_pattern=/tmp/%e-%t-%p.core

Niveau :      
Résumé : chmod +x test.c

Après une technique utilisant du perl, voici une nouvelle façon d'utiliser du C aussi simplement qu'un script.

Cette fois nous évitons l'usage de perl, on se passe donc de ses avantages en terme de parsing. Par contre, on utilise un en-tête court et le code fonctionne avec n'importe quel code valide en C. Comme d'habitude, on fait propre et on renvoie le bon code de retour.

#!/bin/sh
tail -n +4 $0 | gcc -Wall -o /tmp/cscript.$$ -x c - && /tmp/cscript.$$ "$@"
ret=$? ; rm -f /tmp/cscript.$$ ; exit $ret
//
// Code C
//
#include <stdio.h>
int main(int argc, char** argv)
{
        printf( "Appel de %s avec %d arguments\n", argv[0], argc-1 );
        return 0;
}

Et maintenant on teste pour prouver que ça marche :

chmod +x test.c
./test.c 1 2 3 && echo "OK" | | echo "KO"

Niveau :      
Résumé : optiong ; unfoo ; shopt -s dotglob ; GLOBIGNORE

Ah, le grand retour du vrac, ça faisait longtemps !

Reduire la taille d'un png (sans perte) :

# il semble en général meilleur que pngcrush
$ apt-get install optipng 
# modifie le fichier inline
$ optipng fichier.png 

Décompression de n'importe quel format

# script de décompression 
$ sudo wget -O /usr/local/bin/unfoo http://obsoleet.org/code/unfoo/unfoo-1.0.6.sh
$ chmod +x /usr/local/bin/unfoo
# on cherche à décompresser toto.truc, on se fout du format
$ unfoo toto.truc

Inclure les fichiers commençant par . dans * :

# option de bash
$ shopt -s dotglob
# et hop ils apparaissent
$ echo *

Inclure les fichiers commençant par . dans * (bis) :

$ export GLOBIGNORE="."
$ echo *

Obtenir la taille d'un périphérique de bloc (comme un disque) :

$ blockdev --getsize64 /dev/sda1

Raccourci pour connaître l'heure actuelle chez votre correspondant à l'autre bout de la planète :

$ alias pdate="TZ='Pacific/Noumea' date"

Niveau :      
Résumé : inetd ; xinetd

Écrire un service c'est facile. La preuve en ligne avec un serveur qui dit bonjour en shell en 5mn.

Tout d'abord codons un script qui vous dit bonjour.

#!/bin/sh
echo "Quel est votre nom ?"
read nom
echo "Bonjour $nom"

Appelons-le /srv/tests/serveur.sh et testons le :

$ chmod +x /srv/tests/serveur.sh
$ /srv/tests/serveur.sh

Et maintenant transformons tout ça en service. Pour cela il nous faut un inetd fonctionnel, soit le vieux netkit-inetd, soit xinetd, soit le plus récent openbsd-inetd.

Ajoutons une configuration inetd (netkit ou openbsd):

1234    stream  tcp     nowait  root    /srv/tests/serveur.sh

Qui nous donne pour xinetd :

service 1234
{
        type            = UNLISTED
        socket_type     = stream
        protocol        = tcp
        user            = root
        wait            = no
        server          = /srv/tests/serveur.sh
        port            = 1234
}

Testez :

$ telnet localhost 1234

C'est prêt !