[PYTHON] Wheel Reinvention: libMerge pour fusionner les définitions de fonctions de la bibliothèque Bash dans ShellScript

Préface

Dans cet article, je décrirai libMerge, un script Python 3.x que j'ai créé. libMerge a la capacité de fusionner les définitions de fonctions de la bibliothèque Bash dans ShellScript. Pour être précis, seule la partie définition de la fonction utilisée dans Script est extraite de la bibliothèque Bash. Créez un nouveau script qui décrit «la fonction extraite + le contenu du script d'origine».

La raison de la création de libMerge est la suivante.

  1. Bash n'a pas de bibliothèque à usage général et il n'y a pas de compréhension commune des fonctions des fonctions de la bibliothèque. Par conséquent, il est préférable de fournir un script permettant à un tiers de se référer facilement à la définition de fonction.
  2. Je ne souhaite pas publier manuellement les définitions de fonctions de bibliothèque dans Script pour des tiers.
  3. Les scripts qui ne sont pas complets dans un seul fichier sont moins portables. Si la bibliothèque ne peut pas être incluse, ou si la bibliothèque est modifiée, cela ne fonctionnera pas.

D'ailleurs, en 2005, dans l'article "shsubrmerge (CodeZine) pour partager et fusionner des scripts shell" Un script avec presque la même fonction est publié. C'est une réinvention des roues. De plus, il semble qu'il n'y ait pas de package célèbre avec une fonction équivalente, donc On s'attend à ce qu'il n'y ait pas de demande. ~~ C'est bien parce que je peux résoudre mon problème (・ mot ・) ~~

table des matières

  1. Installez libMerge
  2. Bibliothèque de référence: bashLib
  3. Options de libMerge
  4. Comment utiliser libMerge
  5. Traitement libMerge (mécanisme)  6. Limitation

Installez libMerge

Puisqu'il est publié sur Github, vous pouvez l'obtenir par la procédure suivante (hypothèse Debian). Le répertoire d'installation de libMerge se trouve sous "/ usr / local / bin /".

$ git clone https://github.com/nao1215/BashScriptsCompilation.git -b master
$ cd BashScriptsCompilation
$ sudo ./installScripts         #Script d'installation

Bibliothèque d'exemples: À propos de bashLib

Puisqu'il semble que peu de gens aient une bibliothèque Bash, nous avons préparé une bibliothèque d'exemples, bashLib. BashLib sera également installé en utilisant la procédure d'installation précédente.

Les fonctions qui existent dans bashLib sont les suivantes.

Nom de la fonction La description
errMsg Message d'erreur affiché en rouge sur la sortie standard
warnMsg Afficher le message d'erreur en lettres noires sur la sortie standard
checkArgc Vérifiez le nombre d'arguments
isFile Vérifiez si le fichier existe
isDir Vérifiez si le répertoire existe
isSubshell le script est"source"Vérifiez s'il est exécuté par la commande
isNumeric Vérifier si la variable est quantifiée
isNull variable(Chaîne)Vérifier si est nul
isRoot Vérifiez si l'utilisateur est root
++ variable(Valeur numérique)Incrément
-- variable(Valeur numérique)Décrémenter
AplusB Ajouter la valeur spécifiée à la variable
AminusB Soustraire la valeur spécifiée à la variable
_sum variable(Valeur numérique)Ajouter
makeDir Après diverses confirmations, créez un répertoire
makeEmptyFile Après diverses confirmations, créez un fichier de 0 octet
getLineNum Obtenez le nombre de lignes dans le fichier
dos2unix Convertir des fichiers du format Windows au format Unix

Options de libMerge

option La description
-l(--lib) Décrivez le PATH vers la bibliothèque Bash.
-s(--script) Au script qui veut donner une définition de fonction dans la bibliothèque
Décrivez le CHEMIN.
-o(--output) Script qui a publié la définition de la fonction(Créer un nouveau)Nom
Si vous souhaitez le modifier, entrez le nom du fichier.
(Défaut:"m_<original_scriptname>)"

Comment utiliser libMerge

À titre d'exemple, préparez l'exemple de script suivant (sample.sh). Dans sample.sh, makeDir () et errMsg () définis dans "/ usr / local / bin / bashLib" sont utilisés. Pour utiliser ces fonctions, vous devez inclure la bibliothèque avec la commande "source".

sample.sh


#!/bin/bash
# Description : Sample Script

source /usr/local/bin/bashLib  #La bibliothèque comprend
makeDir "dir"                  #Fonction bibliothèque
errMsg "Sample"             #Comme ci-dessus

Résultat d'exécution.


$ ./sample.sh 
make directory dir
Sample

Utilisez libMerge pour ajouter une définition de fonction au sample.sh ci-dessus. De plus, au lieu d'insérer la définition de fonction directement dans sample.sh, un nouveau script appelé m_sample.sh est généré. Le nom du nouveau script ici peut être modifié avec l'option "-o".

$ ls
sample.sh
$ libMerge -s sample.sh -l /usr/local/bin/bashLib
$ ls
m_sample.sh  sample.sh

Le m_sample.sh généré est le suivant. La définition de fonction est insérée sous l'en-tête Script et seule la définition de fonction utilisée dans Script (sample.sh) est publiée.

m_sample.sh


#!/bin/bash                                                                           
# Description : Sample Script
function errMsg() {
    local message="$1"
    echo -n -e "\033[31m\c"  # Escape sequence to make text color red 
    echo "${message}"
    echo -n -e "\033[m\c"   # Escape sequence to restore font color
}

function makeDir() {
    local dir_path="$1"

    checkArgc "$#"
    if [ -d "${dir_path}" ]; then
        echo "Directory "${dir_path}" already exists. Not make it."
    else
        mkdir -p $1
        if [ "$?" = 0 ]; then
            echo "make directory "${dir_path}""
        fi    
    fi  
}


source /usr/local/bin/bashLib  #La bibliothèque comprend

makeDir "dir"
errMsg "Sample"

traitement libMerge (mécanisme)

Voici un aperçu du processus libMerge.

  1. Vérification des options (notification d'erreur en cas de défaut)
  2. Analysez la bibliothèque Bash et créez une liste de numéros de ligne de début et de fin pour la définition de fonction
  3. Obtenez le nom de la fonction qui existe dans la bibliothèque Bash
  4. En vous basant sur le résultat de l'étape 2, obtenez la partie définition de la fonction pour chaque fonction. Gérer les définitions dans un dictionnaire avec le nom de la fonction comme valeur clé
  5. Analysez le script et supprimez les fonctions autres que celles utilisées dans le script de la liste et du dictionnaire.
  6. Insérez des éléments de dictionnaire (définitions de fonction) sous l'en-tête du script lors de la création d'une copie du script (m_ \ <nom_script >)

Limitation -Il y a place à amélioration dans l'extraction de la partie de définition de fonction (en particulier la fin de la définition). -La fonction de suppression de la bibliothèque inclut le traitement qui existe dans le script d'origine n'est pas encore implémentée. ・ Nous n'avons pas effectué suffisamment de tests.

finalement

"Parce que l'objectif pour 2017 est" la création de packages (langage C) ", implémentons libMerge en langage C." J'ai pensé à une telle chose au moment de la conception (dormir le 17 février 2011), mais je l'ai implémentée en Python et c'était la bonne réponse.

De plus, la raison pour laquelle il est difficile de transformer Bash en bibliothèque est "Manque de valeur de retour" "La nature de Bash qui utilise pleinement les canaux de redirection" Je l'ai expérimenté avec la création de libMerge et bashLib cette fois. Les avantages de la création d'une bibliothèque sont «l'amélioration de la lisibilité d'une doublure (shell art)» et «l'intégration du traitement des modèles». Si vous essayez de créer une bonne bibliothèque qui exige plus que cela, vous risquez de vous enliser.

Recommended Posts

Wheel Reinvention: libMerge pour fusionner les définitions de fonctions de la bibliothèque Bash dans ShellScript
N'hésitez pas à transformer Python en utilisant la bibliothèque en une fonction AWS Lambda
Comment utiliser la bibliothèque C en Python
Un mémorandum pour enregistrer la bibliothèque écrit en Hy dans PyPI
Comment déboguer une bibliothèque Python standard dans Visual Studio
J'ai essayé d'implémenter la fonction d'envoi de courrier en Python
Remarques sur l'utilisation de la guimauve dans la bibliothèque de schémas