Recherche de site Web

Exemples utiles de trucs et astuces en ligne de commande Bash - Partie 1


La ligne de commande Bash offre une puissance presque illimitée lorsqu’il s’agit d’exécuter presque tout ce que vous voulez faire. Qu’il s’agisse de traiter un ensemble de fichiers, d’éditer un ensemble de documents, de gérer des données volumineuses, de gérer un système ou d’automatiser une routine, Bash peut tout faire. Cette série, dont nous présentons aujourd’hui la première partie, ne manquera pas de vous armer des outils et des méthodes dont vous avez besoin pour devenir un utilisateur beaucoup plus compétent de Bash. Même les utilisateurs déjà avancés choisiront probablement quelque chose de nouveau et d’excitant. Jouir!

Dans ce tutoriel, vous allez apprendre :

  • Conseils, astuces et méthodes utiles de la ligne de commande Bash
  • Comment interagir avec la ligne de commande Bash de manière avancée
  • Comment affiner vos compétences globales en Bash et devenir un utilisateur plus compétent de Bash

Exemples utiles de trucs et astuces de ligne de commande Bash - Partie 1

Configuration logicielle requise et conventions utilisées

Exemple 1 : Voir quels processus accèdent à un certain fichier

Vous souhaitez savoir quels processus accèdent à un fichier donné ? Il est facile de le faire à l’aide de la commande intégrée Bash fuser :

fuser -a /usr/bin/gnome-calculator
/usr/bin/gnome-calculator: 619672e
ps -ef | grep 619672 | grep -v grep
abc       619672    3136  0 13:13 ?        00:00:01 gnome-calculator

Comme nous pouvons le voir, le fichier /usr/bin/gnome-calculator (un binaire), est actuellement utilisé par le processus avec l’ID 619672. En vérifiant cet ID de processus à l’aide de ps, nous découvrons rapidement que l’utilisateur abc a démarré la calculatrice et l’a fait à 13:13.

Le e derrière le PID (ID de processus) est d’indiquer qu’il s’agit d’un exécutable en cours d’exécution. Il existe divers autres qualificatifs de ce type, et vous pouvez utiliser man fuser pour les voir. Cet outil de fusion peut être puissant, surtout lorsqu’il est utilisé en combinaison avec lsof (an ls of open files) :

Supposons que nous déboguons un ordinateur distant pour un utilisateur qui travaille avec un bureau Ubuntu standard. L’utilisateur a démarré la calculatrice, et maintenant tout son écran est figé. Nous voulons maintenant tuer à distance tous les processus qui se rapportent de quelque manière que ce soit à l’écran verrouillé, sans redémarrer le serveur, par ordre d’importance de ces processus.

lsof | grep calculator | grep "share" | head -n1
xdg-deskt    3111                                 abc  mem       REG              253,1          3009   12327296 /usr/share/locale-langpack/en_AU/LC_MESSAGES/gnome-calculator.mo
fuser -a /usr/share/locale-langpack/en_AU/LC_MESSAGES/gnome-calculator.mo
/usr/share/locale-langpack/en_AU/LC_MESSAGES/gnome-calculator.mo:  3111m  3136m 619672m 1577230m
ps -ef | grep -E "3111|3136|619672|1577230" | grep -v grep
abc         3111    2779  0 Aug03 ?        00:00:11 /usr/libexec/xdg-desktop-portal-gtk
abc         3136    2779  5 Aug03 ?        03:08:03 /usr/bin/gnome-shell
abc       619672    3136  0 13:13 ?        00:00:01 gnome-calculator
abc      1577230    2779  0 Aug04 ?        00:03:15 /usr/bin/nautilus --gapplication-service

Tout d’abord, nous avons localisé tous les fichiers ouverts utilisés par la calculatrice à l’aide de lsof. Pour que le résultat soit court, nous n’avons répertorié que le premier résultat pour un seul fichier partagé. Ensuite, nous avons utilisé fuser pour savoir quels processus utilisent ce fichier. Cela nous a fourni les PID. Enfin, nous avons effectué une recherche à l’aide d’un grep basé sur OR (|) pour trouver le nom réel du processus. Nous pouvons voir que alors que la calculatrice a été lancée à 13h13, les autres processus ont duré plus longtemps.

Ensuite, nous pourrions émettre, par exemple, un kill -9 619672 et vérifier si cela a résolu le problème. Si ce n’est pas le cas, nous pourrions essayer le processus 1577230 (le gestionnaire de fichiers partagé de Nautilus), le processus 3136 (le shell global) ou enfin le processus 3111, bien que cela tuerait probablement une partie importante de l’expérience de bureau de l’utilisateur et pourrait ne pas être facile à redémarrer.

Exemple 2 : Débogage de vos scripts

Vous avez donc écrit un excellent script, avec beaucoup de code complexe, puis vous l’avez exécuté... et voir une erreur dans la sortie, ce qui à première vue n’a pas beaucoup de sens. Même après un certain temps de débogage, vous êtes toujours bloqué sur ce qui s’est passé pendant l’exécution du script.

bash -x à la rescousse ! bash -x permet d’exécuter un script test.sh et de voir exactement ce qui se passe :

#!/bin/bash
VAR1="Hello linuxconfig.org readers!"
VAR2="------------------------------"
echo ${VAR1}
echo ${VAR2}

Exécution:

bash -x ./test.sh
+ VAR1='Hello linuxconfig.org readers!'
+ VAR2=------------------------------
+ echo Hello linuxconfig.org 'readers!'
Hello linuxconfig.org readers!
+ echo ------------------------------
------------------------------

Comme vous pouvez le voir, la commande bash -x nous a montré exactement ce qui s’est passé, étape par étape. Vous pouvez également envoyer facilement la sortie de cette commande dans un fichier en ajoutant 2>&1 | tee my_output.log à la commande :

bash -x ./test.sh 2>&1 | tee my_output.log
... same output ...
cat my_output.log
+ VAR1='Hello linuxconfig.org readers!'
+ VAR2=------------------------------
+ echo Hello linuxconfig.org 'readers!'
Hello linuxconfig.org readers!
+ echo ------------------------------
------------------------------

Le 2>&1 enverra le stderr (sortie d’erreur standard : toutes les erreurs observées lors de l’exécution) à stdout (sortie standard : vaguement définie ici comme la sortie que vous voyez habituellement sur le terminal) et capturera toute la sortie de bash -x. La commande tee capturera toute la sortie de stdout et l’écrira dans le fichier indiqué. Si jamais vous voulez ajouter à un fichier (et ne pas recommencer avec un fichier vide), vous pouvez utiliser tee -a où l’option -a garantira que le fichier est ajouté.

Exemple 3 : Un piège courant : sh -x != bash -x

Le dernier exemple nous a montré comment utiliser bash -x, mais pourrions-nous également utiliser sh -x ? La tendance pour certains nouveaux utilisateurs de Bash peut être d’exécuter sh -x, mais c’est une erreur de débutant ; SH est une coquille beaucoup plus limitée. Bien que bash soit basé sur sh, il a beaucoup plus d’extensions. Ainsi, si vous utilisez sh -x pour déboguer vos scripts, vous verrez des erreurs étranges. Vous voulez voir un exemple ?

#!/bin/bash

TEST="abc"
if [[ "${TEST}" == *"b"* ]]; then
  echo "yes, in there!"
fi

Exécution:

./test.sh
yes, in there!
bash -x ./test.sh
+ TEST=abc
+ [[ abc == *\b* ]]
+ echo 'yes, in there!'
yes, in there!
sh -x ./test.sh
+ TEST=abc
+ [[ abc == *b* ]]
./test: 4: [[: not found

Ici, vous pouvez voir un petit script de test test.sh qui, lorsqu’il est exécuté, vérifie si une certaine lettre (b) apparaît dans une certaine chaîne d’entrée (telle que définie par la variable TEST). Le script fonctionne très bien, et lorsque nous utilisons bash -x, nous pouvons voir que les informations présentées, y compris la sortie, semblent correctes.

Ensuite, en utilisant sh -x, les choses tournent mal ; L’interpréteur de commandes sh ne peut pas interpréter [[ et échoue à la fois dans la sortie sh -x et dans l’exécution du script lui-même. C’est parce que la syntaxe if avancée implémentée dans bash n’existe pas dans sh.

Exemple 4 : uniq ou pas unique – telle est la question !

Avez-vous déjà voulu trier un fichier et ne répertorier que les entrées uniques ? À première vue, cela semble être un exercice facile en utilisant la commande Bash incluse uniq :

cat input.txt 
1
2
2
3
3
3
cat input.txt | uniq
1
2
3

Cependant, si nous modifions un peu notre fichier d’entrée, nous rencontrons des problèmes d’unicité :

cat input.txt 
3
1
2
3
2
3
3
3
cat input.txt | uniq
3
1
2
3
2
3

C’est parce que uniq par défaut filtrera les lignes correspondantes adjacentes, les lignes correspondantes étant fusionnées à la première occurrence comme le manuel uniq le clarifie. En d’autres termes, seules les lignes qui sont exactement les mêmes que les précédentes seront supprimées.

Dans l’exemple, cela peut être vu par les trois dernières lignes 3 condensées en un seul 3 « unique ». Cela n’est probablement utilisable que dans un nombre limité et des cas d’utilisation spécifiques.

Nous pouvons cependant modifier uniq un peu plus loin pour ne nous donner que des entrées vraiment uniques en utilisant le paramètre -u :

cat input.txt  # Note that the '#' symbols were added after execution, to clarify something (read below)
3  #
1  #
2  #
3  #
2  #
3
3
3
cat input.txt | uniq -u 
3
1
2
3
2

Cela semble encore un peu déroutant, non ? Regardez de près l’entrée et la sortie et vous pouvez voir comment seules les lignes qui sont individuellement uniques (comme marquées par # dans l’exemple ci-dessus après l’exécution) sont affichées.

Les trois dernières lignes 3 ne sont pas sorties car elles ne sont pas uniques en tant que telles. Cette méthode d’unicité aurait encore une fois une applicabilité limitée dans des scénarios du monde réel, bien qu’il puisse y avoir quelques cas où elle s’avère utile.

Nous pouvons obtenir une solution plus adaptée à l’unicité en utilisant un outil intégré Bash légèrement différent ; Trier :

cat input.txt 
1
2
2
3
3
3
cat input.txt | sort -u
1
2
3

LE SAVIEZ-VOUS ?
Vous pouvez omettre la commande cat dans les exemples ci-dessus et fournir un fichier à uniq ou trier pour lire directement ? Exemple :sort -u input.txt

Génial! Ceci est utilisable dans de nombreux scripts où nous aimerions une véritable liste d’entrées uniques. L’avantage supplémentaire est que la liste est bien triée en même temps (bien que nous ayons peut-être préféré utiliser l’option -n pour trier également dans un ordre numérique en fonction de la valeur numérique de la chaîne).

Conclusion

Il y a beaucoup de plaisir à utiliser Bash comme ligne de commande Linux préférée. Dans ce tutoriel, nous avons exploré un certain nombre de conseils et d’astuces utiles en ligne de commande Bash. C’est le coup d’envoi d’une série d’exemples de ligne de commande Bash qui, si vous suivez, vous aideront à devenir beaucoup plus avancé dans et avec la ligne de commande Bash et le shell !

Faites-nous part de vos réflexions et partagez ci-dessous quelques-uns de vos propres conseils, astuces et pièges en ligne de commande bash !

  • Exemples utiles de trucs et astuces de ligne de commande Bash - Partie 1
  • Exemples utiles de trucs et astuces de ligne de commande Bash - Partie 2
  • Exemples utiles de trucs et astuces de ligne de commande Bash - Partie 3
  • Exemples utiles de trucs et astuces de ligne de commande Bash - Partie 4
  • Exemples utiles de trucs et astuces en ligne de commande Bash - Partie 5

Articles connexes: