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.
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 ・) ~~
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
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 |
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>)" |
À 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"
Voici un aperçu du processus libMerge.
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.
"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