[PYTHON] Wheel Reinvention: libMerge zum Zusammenführen von Funktionsdefinitionen in der Bash-Bibliothek in ShellScript

Vorwort

In diesem Artikel werde ich libMerge beschreiben, ein Python 3.x-Skript, das ich erstellt habe. libMerge bietet die Möglichkeit, Funktionsdefinitionen in der Bash-Bibliothek in ShellScript zusammenzuführen. Um genau zu sein, wird nur der Definitionsteil der in Script verwendeten Funktion aus der Bash-Bibliothek extrahiert. Erstellen Sie ein neues Skript, das "extrahierte Funktion + ursprünglicher Skriptinhalt" beschreibt.

Der Grund für die Erstellung von libMerge ist folgender.

  1. Bash verfügt nicht über eine Allzweckbibliothek, und es gibt kein allgemeines Verständnis der Funktionen von Funktionen in der Bibliothek. Daher ist es vorzuziehen, ein Skript bereitzustellen, das es Dritten erleichtert, auf die Funktionsdefinition zu verweisen.
  2. Ich möchte Bibliotheksfunktionsdefinitionen nicht manuell für Dritte in Script veröffentlichen.
  3. Skripte, die in einer einzelnen Datei nicht vollständig sind, sind weniger portabel. Wenn die Bibliothek nicht aufgenommen werden kann oder wenn die Bibliothek geändert wird, funktioniert sie nicht.

Übrigens im Jahr 2005 in dem Artikel "shsubrmerge (CodeZine) zum Teilen und Zusammenführen von Shell-Skripten" Ein Skript mit fast derselben Funktion wird veröffentlicht. Es ist eine Neuerfindung der Räder. Darüber hinaus scheint es kein berühmtes Paket mit gleichwertiger Funktion zu geben Es wird erwartet, dass keine Nachfrage besteht. ~~ Es ist gut, weil ich mein Problem lösen kann (・ Wort ・) ~~

Inhaltsverzeichnis

  1. Installieren Sie libMerge
  2. Referenzbibliothek: bashLib
  3. libMerge-Optionen
  4. Verwendung von libMerge
  5. libMerge-Verarbeitung (Mechanismus)  6. Limitation

Installieren Sie libMerge

Da es auf Github veröffentlicht ist, können Sie es durch das folgende Verfahren erhalten (Debian-Annahme). Das Installationsverzeichnis von libMerge befindet sich unter "/ usr / local / bin /".

$ git clone https://github.com/nao1215/BashScriptsCompilation.git -b master
$ cd BashScriptsCompilation
$ sudo ./installScripts         #Installationsskript

Beispielbibliothek: Über bashLib

Da anscheinend nur wenige Leute eine Bash-Bibliothek haben, haben wir eine Beispielbibliothek, bashLib, vorbereitet. Mit dem obigen Installationsverfahren wird auch bashLib installiert.

Die in bashLib vorhandenen Funktionen sind wie folgt.

Funktionsname Erläuterung
errMsg Fehlermeldung wird in der Standardausgabe rot angezeigt
warnMsg Zeigen Sie die Fehlermeldung in schwarzer Schrift auf der Standardausgabe an
checkArgc Überprüfen Sie die Anzahl der Argumente
isFile Überprüfen Sie, ob die Datei vorhanden ist
isDir Überprüfen Sie, ob das Verzeichnis vorhanden ist
isSubshell Skript ist"source"Überprüfen Sie, ob es vom Befehl ausgeführt wird
isNumeric Überprüfen Sie, ob die Variable quantifiziert ist
isNull Variable(String)Überprüfen Sie, ob Null ist
isRoot Überprüfen Sie, ob der Benutzer root ist
++ Variable(Numerischer Wert)Zuwachs
-- Variable(Numerischer Wert)Dekrement
AplusB Fügen Sie der Variablen den angegebenen Wert hinzu
AminusB Subtrahieren Sie den angegebenen Wert von der Variablen
_sum Variable(Numerischer Wert)Hinzufügen
makeDir Erstellen Sie nach verschiedenen Bestätigungen ein Verzeichnis
makeEmptyFile Erstellen Sie nach verschiedenen Bestätigungen eine 0-Byte-Datei
getLineNum Ermitteln Sie die Anzahl der Zeilen in der Datei
dos2unix Konvertieren Sie Dateien vom Windows-Format in das Unix-Format

libMerge-Optionen

Möglichkeit Erläuterung
-l(--lib) Beschreiben Sie den Pfad zur Bash-Bibliothek.
-s(--script) Zu einem Skript, das eine Funktionsdefinition in der Bibliothek geben möchte
Beschreibe den WEG.
-o(--output) Skript, das die Funktionsdefinition veröffentlicht hat(Erstelle neu)Name
Wenn Sie es ändern möchten, geben Sie den Dateinamen ein.
(Standard:"m_<original_scriptname>)"

Verwendung von libMerge

Bereiten Sie als Beispiel das folgende Beispielskript (sample.sh) vor. In sample.sh werden makeDir () und errMsg () verwendet, die in "/ usr / local / bin / bashLib" definiert sind. Um diese Funktionen nutzen zu können, müssen Sie die Bibliothek in den Befehl "source" aufnehmen.

sample.sh


#!/bin/bash
# Description : Sample Script

source /usr/local/bin/bashLib  #Bibliothek enthalten
makeDir "dir"                  #Bibliotheksfunktion
errMsg "Sample"             #Das gleiche wie oben

Ausführungsergebnis.


$ ./sample.sh 
make directory dir
Sample

Verwenden Sie libMerge, um der obigen sample.sh eine Funktionsdefinition hinzuzufügen. Anstatt die Funktionsdefinition direkt in sample.sh einzufügen, wird außerdem ein neues Skript mit dem Namen m_sample.sh generiert. Der Name des neuen Skripts kann hier mit der Option "-o" geändert werden.

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

Die generierte m_sample.sh lautet wie folgt. Die Funktionsdefinition wird unter dem Script-Header eingefügt und nur die in Script (sample.sh) verwendete Funktionsdefinition wird veröffentlicht.

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  #Bibliothek enthalten

makeDir "dir"
errMsg "Sample"

libMerge-Verarbeitung (Mechanismus)

Das Folgende ist eine Übersicht über den libMerge-Prozess.

  1. Optionsprüfung (Fehlermeldung bei Defekt)
  2. Analysieren Sie die Bash-Bibliothek und erstellen Sie eine Liste mit Start- und Endzeilennummern für die Funktionsdefinition
  3. Rufen Sie den Namen der Funktion ab, die in der Bash-Bibliothek vorhanden ist
  4. Ermitteln Sie basierend auf dem Ergebnis von Schritt 2 den Definitionsteil der Funktion für jede Funktion. Verwalten Sie Definitionen in einem Wörterbuch mit dem Funktionsnamen als Schlüsselwert
  5. Analysieren Sie das Skript und löschen Sie die anderen als die im Skript verwendeten Funktionen aus der Liste und dem Wörterbuch.
  6. Fügen Sie Wörterbuchelemente (Funktionsdefinitionen) unter dem Skript-Header ein, während Sie eine Kopie des Skripts erstellen (m_ \ <Skriptname >).

Limitation

Schließlich

"Da das Ziel für 2017" Paketerstellung (C-Sprache) "ist, implementieren wir libMerge in C-Sprache." Ich habe zum Zeitpunkt des Entwurfs (am 17. Februar 2011 geschlafen) über so etwas nachgedacht, aber ich habe es in Python implementiert und es war die richtige Antwort.

Der Grund, warum es schwierig ist, Bash in eine Bibliothek zu verwandeln, ist "Fehlender Rückgabewert" "Die Art von Bash, bei der Umleitungsrohre voll genutzt werden" Ich habe es diesmal mit der Erstellung von libMerge und bashLib erlebt. Die Vorteile der Erstellung einer Bibliothek sind nur "Verbesserung der Lesbarkeit eines Liners (Shell Art)" und "Integration der Vorlagenverarbeitung". Wenn Sie versuchen, eine gute Bibliothek zu erstellen, die mehr verlangt, sind Sie wahrscheinlich festgefahren.

Recommended Posts

Wheel Reinvention: libMerge zum Zusammenführen von Funktionsdefinitionen in der Bash-Bibliothek in ShellScript
Sie können Python mithilfe der Bibliothek in eine AWS Lambda-Funktion verwandeln
Verwendung der C-Bibliothek in Python
Ein Memorandum zur Registrierung der in Hy in PyPI geschriebenen Bibliothek
So debuggen Sie eine Standard-Python-Bibliothek in Visual Studio
Ich habe versucht, die Mail-Sendefunktion in Python zu implementieren
Hinweise zur Verwendung von Marshmallow in der Schemabibliothek