Complétion bash sur OSX avec brew

La complétion ça change la vie.

Bash completion est un projet qui vous permet d’ajouter de la complétion au shell pour tout un tas de programmes ou d’environnements comme la commande scp par exemple.

C’est très pratique lorsque vous faites des copies distantes via scp pour compléter les chemins distants.

Installation sur osx avec brew

$ brew install bash-completion

Il faut ensuite activer les fonctions en ajoutant les lignes suivantes à votre .bash_profile

if [ -f $(brew --prefix)/etc/bash_completion ]; then
   . $(brew --prefix)/etc/bash_completion
fi

Phantomjs : faire un screenshot d’un site en https

J’utilise phantomjs pour faire des captures d’écran régulièrement de pages d’un site pour voir l’évolution de la page ou tout simplement créer des archives sans avoir à y penser.

screenshots avec phantomjs en javascript

Phantomjs permet de manipuler en javascript le moteur de rendu webkit afin de simuler un navigateur en ligne de commande.

Problème de rendu avec phantomjs et le https

En prenant des screenshots de notre site de coaching,  je me suis aperçu que les fichiers png générés étaient vides.

Après investigation, il s’avère que par défaut, phantomjs peut avoir des problèmes avec les sites en https.

Pour résoudre la situation, il faut utiliser le switch –ssl-protocol=any ou –ssl-protocol=TLSv1. Par défaut phantomjs utilise SSLv3 qui ne fonctionne pas dans mon cas.

phantomjs --ssl-protocol=any fitnext.js

Script pour faire le rendu phantomjs

Le javascript final qui permet de faire le screenshot ressemble à ceci :

var page = new WebPage();
page.settings.userAgent = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.65 Safari/537.36';
page.viewportSize = { width: 1280, height: 800 };
page.open('https://www.fitnext.com', function (status) {
    var now = new Date();
    var month = now.getMonth()+1; if (month < 10) month = '0'+month;
    var day = now.getDate(); if (day < 10) day = '0'+day;
    var filename = 'homepage/' + now.getFullYear() +'-'+month+'-'+day+ '_homepage_fitnext.png';
    page.render(filename);
    phantom.exit();
});

Dans ce script, j’utilise les fonctions javascript de date pour créer un nom de fichier qui correspond à la date du jour.

Ici, le nom de fichier de la capture effectuée par phantomjs ressemblera à : 2016-02-20_homepage_fitnext.png

Automatisation des captures d’écran phantomjs

Pour prendre des screenshots quotidiens de la homepage, je configure une tâche cron pour cela :

40 12 * * *     cd /chemin/de/votre/script && phantomjs --ssl-protocol=tlsv1 fitnext.js > /dev/null

Je redirige la sortie standard vers /dev/null pour ne pas recevoir d’email contenant les erreurs javascript de la console.

 

iTerm2 : personnaliser le titre des onglets

Vous pouvez personnaliser le titre d’un terminal avec les séquences d’échappement XTerm, \033]0; et \007

Pour tester directement dans le terminal, si la variable PROMPT_COMMAND n’est pas définie :

echo -ne "\033]0;HELLO\007"

Si vous voulez que le titre soit dynamique, vous pouvez le fixer à chaque exécution d’une commande dans le shell.
Ici, on affichera le chemin courant.

export PROMPT_COMMAND='echo -ne "\033]0;`pwd`\007"'

Pour afficher l’utilisateur courant ainsi que le hostname :

export PROMPT_COMMAND='echo -ne "\033]0;$USER@$HOSTNAME\007"'

Si vous voulez fixer un titre, vous pouvez utiliser par exemple un fichier de configuration dans votre $HOME :

echo "OSX" > $HOME/.term_title
export PROMPT_COMMAND='echo -ne "\033]0;`cat $HOME/.term_title`\007"'

Pour rendre cette commande permanente, il faut l’ajouter au fichier .bash_profile

Bash : renommer des fichiers en remplaçant les espaces

Disons que vous avez une liste de fichiers comme celle-ci :

$ ls -l foie*
foie gras final 2-1.eps		
foie gras step 3.eps		
foie gras step 4.eps		
foie gras step 6.eps		
foie gras step 7.eps

Pour renommer tous les fichiers en remplaçant les espaces par des underscores, utiliser la commande suivante :

for file in foie*; do mv "$file" "`echo $file | tr ' ' '_'`" ; done

Bash : exécuter une commande et tester le contenu de retour

J’ai créé une cron pour vérifier si des changements locaux existent sur des dépôts git.

A priori, il ne devrait pas y en avoir sur des instances en prod mais la théorie reste la théorie, il arrive souvent que des modifications soient apportées en direct sur l’instance, surtout pour des projets persos.

Le but de la commande est d’exécuter un git status -s dans un dépôt et de m’envoyer par email les changements présents. Comme il s’agit d’une tâche cron, le contenu de l’email correspond à la sortie standard. L’autre besoin est d’ajouter un peu de contexte au résultat de la commande en indiquant dans quel dépôt nous nous trouvons.

#!/bin/bash

OUTPUT=$(cd /var/www/tools && git status -s)
if [ -n "${OUTPUT}" ]; then
        echo "git changes in /var/www/tools"
        echo "${OUTPUT}"
        echo
fi

Un email reçu ressemblera à :

----- 8< -----
git changes in /var/www/tools
?? TEST
----- 8< -----

Bash: afficher la date d’une commande dans l’historique

L’historique du shell par défaut est affiché avec le numéro de la commande dans l’hitorique et la commande elle-même.

Exemple :

 $ history
 ...
 650 unzip favicon.zip
 651 more browserconfig.xml
 652 rm favicon.zip
 653 cd wp-content/
 654 ls -l
 655 cd themes/casper-master/
 656 ls -l
 657 vim footer.php
 658 vim footer.php
 659 man history
 660 history

Il peut être pratique de retrouver quand une commande a été exécutée. Pour cela, il faut changer le format d’affichage de la commande via une variable d’environnement.

Pour changer le format dans la session courante :

HISTTIMEFORMAT="%d/%m/%y %T "

Pour changer le format à chaque ouverture de session, il faut mettre son fichier .bash_profile :

echo 'export HISTTIMEFORMAT="%d/%m/%y %T "' >> ~/.bash_profile

L’historique après la mise à jour du format :

 $ history
  ...
  650  03/08/15 18:12:55 unzip favicon.zip
  651  03/08/15 18:12:59 more browserconfig.xml
  652  03/08/15 18:13:05 rm favicon.zip
  653  03/08/15 18:15:14 cd wp-content/
  654  03/08/15 18:15:14 ls -l
  655  03/08/15 18:15:18 cd themes/casper-master/
  656  03/08/15 18:15:19 ls -l
  657  03/08/15 18:15:21 vim footer.php
  658  03/08/15 18:17:28 vim footer.php
  659  03/08/15 18:19:28 man history
  660  03/08/15 18:21:14 history
  661  03/08/15 18:23:16 HISTTIMEFORMAT="%d/%m/%y %T "
  662  03/08/15 18:23:19 history