Exemples utiles de trucs et astuces en ligne de commande Bash - Partie 4
Poursuivant notre série sur les trucs et astuces utiles de la ligne de commande Bash, dans l’article d’aujourd’hui, nous allons explorer ne grepping que ce dont vous avez besoin, et commencer par une introduction sur pwd et comment découvrir le chemin à partir duquel un script a été démarré.
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 en ligne de commande Bash - Partie 4
Configuration logicielle requise et conventions utilisées
Exemple 1 : Répertoire de travail du chemin d’accès ? Ou pas?
Nous avons peut-être l’habitude d’appeler pwd en ligne de commande pour nous dire le nom de notre répertoire actuel :
pwd
/home/roel/workspace
Mais si nous voulons obtenir le répertoire à partir duquel un script a été lancé, l’utilisation de cette variable à partir d’un script fonctionne-t-elle également de la même manière ?
cat test_pwd.sh
#!/bin/bash
MY_PATH1="${PWD}"
echo "${MY_PATH1}"
MY_PATH2="$(pwd)"
echo "${MY_PATH2}"
Nous allons utiliser deux façons pour récupérer le chemin d’accès : nous regardons (pour la première affectation de MY_PATH1) la variable prédéfinie automatiquement PWD (niveau OS), et dans le second cas (pour la deuxième affectation de MY_PATH2) nous exécutons pwd dans un sous-shell ($ (...) )) et l’attribuons à MY_PATH2. Exécutons la même chose :
./test_pwd.sh
/home/roel/workspace
/home/roel/workspace
Ça a l’air bien, non ? Oui, peut-être, mais une fois que nous changeons dans un autre répertoire et que nous appelons le script en utilisant son nom de chemin complet ou relatif, la variable PWD (ou la commande pwd) à l’intérieur du script renverra le répertoire dans lequel nous nous trouvions lorsque le script a été lancé. Vérifions ceci :
mkdir test
cd test
../test_pwd.sh
/home/roel/workspace/test
/home/roel/workspace/test
Ce que nous pouvons voir ici, c’est que pwd (ou la variable $PWD) renverra toujours le chemin actuel réel.
Cela peut être un problème : nous pouvons vouloir démarrer un indice, ou accéder à un fichier, à partir du même répertoire (ou d’un sous-répertoire de celui-ci) que celui dans lequel se trouvait le script. C’est souvent le cas pour les scripts Bash plus complexes qui appellent plusieurs indices et/ou fichiers de données et de configuration.
Alors, quelle est la manière uniforme d’obtenir le chemin à partir duquel le script a été lancé ?
On peut envisager d’utiliser la commande dirname « \$0 » :
cat test2.sh
#!/bin/bash
echo "\$0"
dirname "\$0"
Dirname donnera le nom de répertoire – relatif – de toute option qui lui est passée, et dans ce cas, c’est \$0 – une variable spéciale qui est définie lorsqu’un script commence sur le nom du script tel qu’il a été démarré. Testons-le :
./test2.sh
./test2.sh
.
cd test
../test2.sh
../test2.sh
..
C’est mieux, je suppose, et cela peut aider un peu (pour se faire une idée principalement), mais cela ne nous donne toujours pas un nom de chemin pleinement qualifié. Pour cela, nous pouvons utiliser un double wrapper de sous-shell autour de dirname en combinaison avec un chemin complet réel obtenu à partir d’une exécution pwd :
cat make_it_work.sh
#!/bin/bash
MY_PATH="$(cd "$(dirname "\$0")" && pwd)"
echo "${MY_PATH}"
Voyons si cela fonctionne :
./make_it_work.sh
/home/roel/workspace
Jusqu’ici, tout va bien, mais cela fonctionne-t-il lorsque vous l’exécutez à partir d’un sous-répertoire ?
cd test && pwd
/home/roel/workspace/test
../make_it_work.sh
/home/roel/workspace
/home/roel/workspace/make_it_work.sh
/home/roel/workspace
Oui!
Nous passons d’abord en test et vérifions que nous sommes dans le répertoire de test, si cette commande de changement de répertoire (cd) a réussi (comme indiqué par &&).
Dans les deux cas – qu’il soit appelé de manière relative (.. /), ou avec un nom de chemin d’accès complet (/home/roel/workspace/), le résultat est que nous voyons le répertoire à partir duquel le script a été démarré (/home/roel/workspace/) et non le répertoire de travail actuel réel, ou pwd (/home/roel/workspace/test).
En résumé, vous pouvez utiliser le script d’une ligne MY_PATH="$ (cd « $ (dirname « \$0 ») » && pwd) » pour obtenir le nom de répertoire correct et entièrement qualifié à partir de vos scripts. Après cela, l’utilisation d’un ajout relatif fonctionnera bien. Par exemple, vous pouvez utiliser $ {MY_PATH}/include/mysubscript.sh et même $ {MY_PATH}/.. /one_dir_up_file.txt etc.
Exemple 2 : Ne grepper que ce dont vous avez besoin
Avez-vous déjà utilisé grep ? Grep est un utilitaire de ligne de commande Bash polyvalent qui vous permet de sélectionner facilement du texte dans un fichier. La plupart du temps, il est utilisé comme suit :
cat test
line 1 my line
line 2 your lines
line 3 our line
grep 'line 2' test
line 2 your lines
Nous avons un fichier d’entrée avec 3 lignes, et nous recherchons un test spécifique (ligne 2) dans ce fichier. Mais qu’en est-il si vous ne voulez que les lignes qui ont le multiple de ligne (c’est-à-dire des lignes) mentionnées en elles ? Et que diriez-vous si vous vouliez seulement avoir le mot avant lui, y compris le bit de lignes, mais pas la sortie réelle de la ligne x ?
Dans ce cas, nous ne pouvons grep que ce dont nous avons besoin en utilisant l’option -o ('only') pour grep :
grep -o 'lines' test
lines
grep -o '\w\+ lines' test
your lines
Bingo! Nous avons d’abord cherché uniquement le mot « lignes », qui a été trouvé. Nous l’avons ensuite préfixé avec un espace, et une expression régulière qui dit en pseudo-texte : trouvez une limite de mot (\w), au moins une fois et autant de fois que nécessaire (\+) suivie d’un espace. Le résultat est que votre (qui a deux limites de mots, un début et une fin) est inclus. La ligne 2 n’est pas incluse. Bien qu’il ait des limites de mots, il n’y a pas de suffixe de lignes pour celui-ci.
Si vous souhaitez en savoir plus sur les expressions régulières dans Bash, veuillez consulter les expressions régulières Bash pour les débutants avec des exemples, les expressions régulières Bash avancées avec des exemples et vous pouvez également aimer les expressions régulières Python semi-apparentées avec des exemples.
Conclusion
Dans cet article, nous avons exploré pwd et examiné comment utiliser pwd à partir d’un script en combinaison avec dirname pour récupérer le chemin d’accès au répertoire complet à partir duquel le script a été démarré, d’une manière qui fonctionnera toujours. Nous avons également examiné la possibilité de ne grepper que ce dont nous avons besoin en utilisant l’option -o et, dans ce cas, l’expression régulière pour correspondre aux limites des mots.
Laissez-nous un commentaire avec vos meilleurs trucs et astuces de 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
