Cet article présente quelques fonctionnalités et commandes bash qui permettent de gagner du temps.
Enchainement de commande
Pour enchainer 2 commandes il faut placer && entre les 2, par exemple :
mkdir mon_dossier && ls -la
La deuxième commande est exécutée uniquement si la première réussit, sinon il ne se passe rien.
On peut faire également l'inverse. Lancer une deuxième commande uniquement si la première échoue grâce à || :
false || echo 'La première commande a echoué'
La première commande a echoué
Faire des tests
Les tests se font via les crochets []. Il existe une liste d'option. Voici les plus simples et utiles :
- -f : vérifie si un fichier existe;
- -s : vérifie si un fichier existe et s'il est non nul;
- -z : vérifie si la variable d'environnement existe.
On peut les combiner avec le && ou le ||, cela permet de faire des choses puissantes soit dans un script bash, soit directement en ligne de commande, par exemple :
[ -f fichier.log ] && rm fichier.log && echo 'Fichier supprimé'
Si le fichier fichier.log existe, il est alors supprimé et un message de succès s'affiche. Si le fichier n'existe pas, il ne se passe rien et aucun message d'erreur ne sera affiché.
Modifier le prompt
Le format du prompt est stocké dans la variable d'environnement PS1. Vous pouvez l'afficher grâce à la commande ci-dessous :
echo $PS1
\[\e]0;\u@\h: \w\a\]${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$
\u correspond au nom de l'utilisateur, \h au nom de l'hôte, \w au working directory, \A pour l'heure actuelle.
Vous pouvez donc modifier le prompt en modifiant la variable PS1. Il existe de nombreuses options, on peut utiliser des fonctions, changer les couleurs, etc. On ne rentrera pas dans les détails ici. Pour se faciliter la tâche, il existe des sites web qui propose de personnaliser le prompt de manière graphique, puis de copier/coller le code dans le fichier .bashrc.
Mode debug
Pour activer le mode debug lors du lancement d'un script bash, il faut utiliser l'option -x :
bash -x test.sh
Chaque commande exécutée par le script sera alors affichée, précédée par un +.
Gérer les données sauvegardées dans l'historique
bash conserve dans l'historique les commandes tapées. Cela permet à l'utilisateur de retrouver les anciennes commandes utilisées via divers raccourcis.
Dans certaines situations, il n'est pas souhaitable d'enregistrer les commandes dans l'historique (par exemple par soucis de sécurité). Il est possible de paramétrer bash pour lui dire de ne pas enregistrer les commandes qui commencent par exemple par un espace. Pour cela, il faut modifier la variable d'environnement HISTIGNORE :
export HISTIGNORE=' '
Maintenant si vous tapez une commande sans espace initial, elle sera sauvegardée dans l'historique. Si par contre vous tapez une commande avec un espace initial, elle ne sera pas sauvegardée.
Correction automatique de chemin
Pour demander à bash d'essayer de corriger automatiquement les fautes de frappe dans les chemins, tapez la commande ci-dessous :
shopt -s cdspell
Maintenant essayez d'accéder à un chemin comportant une faute de frappe (par exemple ici, il manque le o) :
cd /usr/lcal/bin
bash va lors automatiquement corriger la faute de frappe et vous vous trouvez dans le bon dossier :
cd /usr/lcal/bin
/usr/local/bin
Les alias
Relancer la commande précédente en sudo
Quand vous lancez une commande sans sudo alors qu'elle le nécessitait, vous avez un message d'erreur :
Access denied
failed!
Au lieu d'éditer votre commande précédente pour rajouter un sudo, il existe l'alias please qui va simplement faire ce boulot à votre place. Il doit être ajouté à votre .bashrc ou .bash_aliases :
alias please='sudo $(history -p \!\!)'
Na pas utiliser l'alias
De nombreuses commandes sont aliasées sur elle-mêmes, comme :
alias ls=ls --color
Si vous souhaitez utiliser la commande sans alias, il suffit de la préfixer par \. Par exemple :
\ls
Quelques commandes utiles
Ouverture d'un fichier avec l'application par défaut
Par exemple pour ouvrir un fichier quelconque, tapez la commande ci-dessous. Le système d'exploitation va automatiquement choisir le programme défaut qui est capable de lire ce format de fichier :
xdg-open fichier.jpg
Surveiller l'état d'une commande
La commande watch permet de surveiller l'état d'une autre commande. Par exemple ici, elle va rafraichir l'écran toutes les 2 secondes en affichant la taille (du -hs) du dossier tmp, qui se vide via la commande rm -f.
rm -f tmp/* && watch du -hs tmp
Lire un fichier à l'envers
La commande tac fait exactement l'inverse de cat :
tac mon_fichier
ligne_trois
ligne_deux
ligne_un
Lire les lignes d'un fichier à l'envers
tac mon_fichier | rev
siort_engil
xued_engil
nu_engil
Concaténer 2 fichiers ligne par ligne
paste fichier_un fichier_deux
On peut préciser un séparateur avec l'option -d, cela peut être utile pour faire des fichiers CSV :
paste fichier_un fichier_deux -d ";"
Manipuler des fichiers json
La commande jq est un grep amélioré pour le json. Pour commencer, elle permet d'afficher du json formaté :
echo '{"widget": {"debug": "on","window": {"title": "Sample Konfabulator Widget","name": "main_window","width": 500,"height": 500},"image": { "src": "Images/Sun.png","name": "sun1","hOffset": 250,"vOffset": 250,"alignment": "center"},"text": {"data": "Click Here","size": 36,"style": "bold","name": "text1","hOffset": 250,"vOffset": 100,"alignment": "center","onMouseUp": "sun1.opacity = (sun1.opacity / 100) * 90;"}}}' | jq .
On obtient en sortie :
Elle permet également d'extraire des valeurs. Par exemple ici, on veut récupérer la valeur de style :
echo '{"widget": {"debug": "on","window": {"title": "Sample Konfabulator Widget","name": "main_window","width": 500,"height": 500},"image": { "src": "Images/Sun.png","name": "sun1","hOffset": 250,"vOffset": 250,"alignment": "center"},"text": {"data": "Click Here","size": 36,"style": "bold","name": "text1","hOffset": 250,"vOffset": 100,"alignment": "center","onMouseUp": "sun1.opacity = (sun1.opacity / 100) * 90;"}}}' | jq .widget.text.style
"bold"
Timeout
La commande timeout comme son nom l'indique permet de créer un timeout. Il faut lui donner un temps limite en secondes, minutes, heures ou jours et la commande que l'on veut exécuter. Si cette dernière dépasse le temps limite alors la commande timeout stoppe celle-ci. Par exemple :
timeout 120 ma_commande
Si la commande ma_commande dépasse les 120 secondes alors elle sera arrêtée par la commande timeout.
Dupliquer la sortie standard
Si vous souhaitez écrire ce qui provient de l'entrée standard à la fois vers la sortie standard et dans un fichier, vous pouvez utiliser la commande tee.
./mon_script | tee mon_script.log
Traitement 1/3
Traitement 2/3
Traitement 3/3
On a ainsi à la fois un affichage sur la console et un fichier mon_script.log contenant l'ensemble des sorties du script.
Un grep pour développeur
Il existe 2 outils qui sont des grep améliorés pour les développeurs : ack et ripgrep. Ils permettent de faire des recherches tout en évitant automatiquement les fichiers inutiles comme les fichiers .git, .svn, etc. Ils proposent de la coloration syntaxique en fonction des langages.
Par exemple avec ack, on peut chercher dans un seul type de langage :
ack --php ma_recherche
Gestion du presse papier avec les sessions distantes
La commande xclip permet de gérer le presse-papier de X-window. Ce presse-papier permet de sélectionner avec la souris (clic gauche) et de coller avec le clic du milieu. La commande permet de récupérer la sortie standard (ou un fichier) et copier le résultat dans le presse-papier.
Cette commande est utile par exemple pour copier des données d'une session distante via SSH et les coller sur sa machine locale. Il est nécessaire d'utiliser l'option -X de SSH pour avoir accès au presse-papier de la session distante :
ssh -X mon_serveur
cat mon_fichier | xclip
exit
Si maintenant vous faites clic du milieu sur votre machine locale, le contenu du fichier distant qui a été copié apparaitra bien sur votre machine locale.
Naviguer entre 2 dossiers
La commande cd possède une option qui permet de revenir dans le précédent dossier où se trouvait l'utilisateur :
cd -
L'utilisateur peut ainsi basculer entre 2 dossiers très facilement, sans devoir retaper à chaque fois le chemin complet du dossier précédent.
Exécuter une commande après un find
Si par exemple, on veut supprimer tous les fichiers dans le dossier courant dont le nom commence par archive_, il suffit de taper la commande ci-dessous :
find . -name "archive_*" -exec rm {} \;
Lecture de plusieurs fichiers en parallèle
La commande tail est capable de lire plusieurs fichiers à la fois. En mode flux (-f), cela donne :
tail -f fichier1.log fichier2.log fichier3.log
Un séparateur sera inséré pour bien distinguer les lignes de chaque fichier.
Les options utiles de netstat
Il existe un moyen simple de retenir les meilleurs options de la commande netstat :
netstat -taupe
Grâce à l'animal, vous avez toutes (-a) les connexions tcp/udp (-t -u), le pid responsable de la connexion (-p) avec des informations étendues (-e).
Taille des fichiers lisible pour un humain
Avec la commande , il existe l'option -h qui permet d'afficher la taille des fichiers de manière plus lisible pour un humain :
ls -lh
Trier ou mélanger les lignes d'un fichier
Pour trier un fichier, vous pouvez utiliser la commande sort :
sort mon_fichier
Si vous souhaitez faire l'inverse, il faut utiliser l'option -R. Le mélange se fait de manière aléatoire :
sort -R mon_fichier
Désarchiver avec tar
La commande tar est capable de trouver par elle-même le format de compression de l'archive. Il n'est donc pas nécessaire de lui indiquer manuellement. Quel que soit le format, il suffit donc de taper la commande ci-dessous :
tar -xvf archive.tar.gz
tar -xvf archive.tar.bz2
tar -xvf archive.tar.xz