Christophe Meneses - Développeur
  • Liste des articles
  • Contact
  • Linkedin
  • Github
  • Flux RSS
Tous les articles Bash Les fonctionnalités et commandes utiles de bash
Bash

Les fonctionnalités et commandes utiles de bash

Publié le 07/05/2017.

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 :
Image de l'article : Les fonctionnalités et commandes utiles de bash

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

Début de l'article

Tous les articles Bash Les fonctionnalités et commandes utiles de bash

Liste des articles par catégorie

  1. Tous 124
  2. Apache2
  3. APC1
  4. Assetic2
  5. Bash2
  6. CentOS9
  7. Composer6
  8. CSS1
  9. Debian1
  10. Deployer1
  11. Design Pattern11
  12. Docker6
  13. Doctrine14
  14. Elasticsearch3
  15. Git6
  16. Google Charts1
  17. Hardware1
  18. Hébergement1
  19. JavaScript1
  20. jQuery4
  21. Kibana2
  22. Logstash1
  23. Machine Learning1
  24. MariaDB2
  25. Memcached2
  26. MySQL3
  27. Nginx2
  28. Panther3
  29. PHP59
  30. PHP_CodeSniffer1
  31. PHP-FPM2
  32. PhpMyAdmin1
  33. PhpStorm3
  34. PHPUnit6
  35. PostgreSQL2
  36. RabbitMQ2
  37. SQL1
  38. SVN4
  39. Sybase ASE1
  40. Symfony56
  41. Twig3
  42. Ubuntu14
  43. Vue.js2
  44. Vuex1
  45. Webpack Encore1
  46. Xdebug5

Derniers articles publiés

PHP
Différence entre les mots clés self et static dans le langage PHP

Symfony / Docker / Nginx
Migrer un projet Symfony du protocole HTTP 1.1 au protocole HTTP 2

Vue.js
Utiliser un filtre Vue.js directement dans le JavaScript

PHP / Symfony
Supprimer les messages de dépréciation de type : The "sensio_framework_extra.routing.loader.annot_*" service is deprecated since version 5.2

Symfony / RabbitMQ
Exemple d'utilisation du composant Messenger pour envoyer des emails en asynchrone avec RabbitMQ

PHP Symfony MariaDB HTML5 CSS3 JavaScript Bootstrap

© 2014 - 2019 réalisé par Christophe MENESES