2017-07-03 3 views
0

Ich versuche, alle TXT mit einem Skript in ein anderes Format zu konvertieren.
Ich darf Shell-Befehle nur für die Ziele verwenden, aber ich darf keine Schleifen verwenden ...
BTW Ich muss den Dash-Interpreter verwenden.
Das Skript heißt txtConverter. Es liest txt von stdin und setzt den konvertierten Text (evtl. Markdown oder anderes Format) auf stdout. Also muss ich alle TXT-Dateien im aktuellen Verzeichnis lesen und jede davon mit dem Skript in ein explizites Format mit einem anderen Dateinamen konvertieren.
Zum Beispiel, wenn es nur 1 TXT-Datei im aktuellen Verzeichnis, sollte es zwei Dateien werden nach dem Make-Datei mit:Makefile Dateien im aktuellen Verzeichnis konvertieren

1. Directory: Hallo.txt 
2. using make 
3. Directory: Hallo.txt 
       Hallo.sh 

fand ich etwas wie folgt aus:

OBJ=$(patsubst %.txt, %.sh, $(wildcard *.txt)) 

aussehen Dies sollte für .txt-Dateien und wandeln sie in .sh-Dateien um, oder?

convertToSh : $(OBJ) 
    What kind of Code? 

Aber ich brauche eine Regel, um richtig zu konvertieren?

%.txt : %.sh 

Das Problem ist, ich weiß nicht, wie Shell-Code verwenden, um die .sh-Datei wie zu füllen:

cat $< | ./txtConverter > [email protected] 

Wenn ich $() verwenden Shell-Code auszuführen, es doens't Arbeit als auch wie:

Ich bin neu zu Makefiles und ich suchte in einer Dokumentation, aber ich verstehe nicht wirklich, wie es funktioniert. Ich bin mir nicht sicher, wie es aussieht, wenn Sie all das in einem Makefile zusammenfassen. Thx für Hilfe!

LÖSUNG GEFUNDEN:

Thx an @MadScientist und thx an A Makefile to Convert All Markdown Files to PDFs Using Pandoc

.RECIPEPREFIX = ~ 
OBJS=$(patsubst %.txt, %.sh, $(wildcard *.txt)) 
convertToSh : $(OBJS) 
%.sh : %.txt 
~ ./convertTxtToSh > [email protected] < $< 

funktioniert gut! Gefunden .RECIPEPREFIX = ~ in der GNU-Handbuch von @MadScientist

+0

Hinweis '.RECIPEPREFIX' wurde in GNU make 4.0 hinzugefügt, so dass einige Distributionen ältere Versionen von GNU make haben können, die dies nicht unterstützen. Wenn Sie mit der Antwort zufrieden sind, vergessen Sie nicht, sie zu akzeptieren (klicken Sie auf das Häkchen), damit die Leute sehen, dass die Frage beantwortet wurde. – MadScientist

Antwort

1

Der beste Ort zu gehen, um über zu lernen (IMO) ist die GNU Make Manual. Natürlich gibt es verschiedene Varianten von make und dieses Handbuch diskutiert die GNU-Version, aber das ist wahrscheinlich die am weitesten verbreitete Version da draußen.

Das Rezept einer Regel ist in Shell-Skript-Syntax geschrieben, so dass Sie den Shell-Code direkt dort als Rezept setzen können.

Eine Musterregeldefinition lautet jedoch Ziel: Voraussetzung.Also in Ihrem Fall, in dem Sie ein .sh (das Ziel) von einem .txt (die Voraussetzung) zu erstellen, würden Sie wollen schreiben:

%.sh : %.txt 
     cat $< | ./txtConverter > [email protected] 

Oder die UUOC vermeiden Sie schreiben könnten:

%.sh : %.txt 
     ./txtConverter > [email protected] < $< 

Denken Sie daran, dass Sie vor den Rezeptzeilen ein tatsächliches TAB-Zeichen verwenden müssen. Stellen Sie sicher, dass Ihr Editor es nicht durch Leerzeichen oder etwas anderes ersetzt.

Allerdings ist dies nur eine Vorlage, die sagt make, "wenn Sie foo.sh erstellen möchten, und Sie haben eine foo.txt (oder können Sie herausfinden, wie), dann können Sie dieses Rezept verwenden, um es zu tun ".

Als nächstes müssen Sie sagen, welche .sh Dateien Sie erstellen möchten. Sie haben bereits herausgefunden, wie:

OBJ=$(patsubst %.txt, %.sh, $(wildcard *.txt)) 

Dann müssen Sie sagen, um diese zu bauen. Sie können es mit:

convertToSh : $(OBJ) 

aber diese Regel muss nicht ein Rezept: Es gibt hier nichts zu tun, weil die ganze Arbeit in der Musterregel durchgeführt wird. Dies ist nur eine einfache Möglichkeit, alle Voraussetzungen an einem Ort zu sammeln.

+0

Vielen Dank. Wie verwende ich das Rezept, wenn ich es aus der Bash aufrufen möchte? ConvertToSh ist einfach in bash mit "make convertToSh" aufzurufen. Aber wenn ich das tue, wirft die Bash einen Fehler (muss den Fehler auf Englisch übersetzen) "es gibt keine Regel, um das Ziel" example.sh "zu erstellen, das von convertToSh benötigt wird". – homior

+0

Zum Ausführen müssen Sie nur 'make' eingeben. Es wird standardmäßig das erste explizite Ziel im Makefile erstellen (das wäre hier 'convertToosh'). Oder Sie können 'make convertToosh' explizit ausführen, wenn Sie möchten. (Fyi, wenn Sie "LANG = C make" ausführen, dann werden die Nachrichten in Englisch gedruckt.) – MadScientist

Verwandte Themen