2017-03-05 27 views
0

Dies wird ein reduziertes Beispiel einer Make-Datei, die mein Problem zeigt:Ausführungsfehler in einem Makefile

exec: 
    time (ls > ls.txt; echo $$? > code) 2> time.txt 

make exec läuft gut unter einer Linux-Installation:

Linux-2.6.32-642.4.2.el6.x86_64-x86_64-with-centos-6.8-Final 

aber unter versagt meine Ubuntu-Installation:

Linux-4.4.0-64-generic-x86_64-with-Ubuntu-16.04-xenial 

und pr oduces die Meldung:

/bin/sh: 1: Syntax error: word unexpected (expecting ")") 

keine Probleme, wenn ich den Befehl Zeit direkt vom Terminal laufen.

Gibt es verschiedene Versionen des Befehls in verschiedenen Linux-Installationen? Ich brauche die Version, die eine Reihe von Befehlen erlaubt.

Antwort

0

Setzen Sie ein Semikolon vor "Zeit". Wie es ist, versucht make, Ihren Befehl als eine Liste von Abhängigkeiten zu analysieren.

2

Immer ruft /bin/sh auf, um das Rezept auszuführen. Auf einigen Systemen ist /bin/sh ein Alias ​​für bash, der viele zusätzliche Erweiterungen zur standardmäßigen POSIX-Shell (sh) enthält. Auf anderen Systemen (wie Ubuntu) ist /bin/sh ein Alias ​​für das Bindestrich, der eine kleinere, einfachere, näher an der POSIX-Shell liegende Ebene ist.

Bash hat eine eingebaute time Operation, die eine gesamte Pipeline akzeptiert und die dafür benötigte Zeit anzeigt (run help time an einer Bash Shell-Eingabeaufforderung, um die Dokumentation zu sehen). Andere Shells wie der Bindestrich haben keine eingebaute time, wenn Sie es ausführen, erhalten Sie das Programm /usr/bin/time; Führen Sie man time aus, um die Dokumentation anzuzeigen. Als separates Programm kann es natürlich keine ganze Pipeline zeitlich ablaufen lassen (weil eine Pipeline ein Feature der Shell ist); es kann nur einen einzelnen Befehl geben.

Sie haben verschiedene Möglichkeiten:

Sie Ihr Make-Datei immer zwingen kann bash als Shell zu verwenden, durch Zugabe von:

SHELL := /bin/bash 

zu. Ich empfehle auch, einen Kommentar hinzuzufügen, der beschreibt, warum bash spezifisch benötigt wird.

Oder Sie können Ihre Regel ändern, indem sie die Shell-Aufruf explizit in einem tragbaren Weise zu arbeiten, so dass time nur ein Befehl hat aufzurufen:

exec: 
     time /bin/sh -c 'ls > ls.txt; echo $$? > code' 2>/time.txt 
0

Der einzige Vorschlag, der bash gearbeitet ist in zu zwingen, meine Make-Datei:

SHELL := /bin/bash 

ich habe: auf meinem Ubuntu-Rechner,/bin/sh ist wirklich/bin/dash während auf der CentOS Maschine ist/bin/bash!

Danke!

+0

Übrigens hat der Vorschlag, den Shell-Aufruf explizit zu machen, die Ausgabedatei nicht auf 'time.txt' umgeleitet. – Tsf