2016-05-13 5 views
1

Druck Ich habe unter BefehlMakefile: echo nicht richtig

$ echo \\newcommand{\\coverheight}{11.0in} > tmp 
$ cat tmp 
echo \\newcommand{\\coverheight}{11.0in} > tmp 

Aber wenn ich denselben echo Befehl in Make-Datei mit bin, ist es nicht richtig in Datei schreiben.

# Makefile 
all: 
     printf '\\newcommand{\\coverheight}{11.0in}' > tmp 

Nach dem Ausführen von `make‘ ist die Ausgabe:

$ cat tmp 

ewcommand{ 

Wie Makefile mit echo in eine Datei zu schreiben, richtig mit?

Antwort

0

make sendet nur ein Rezept (außer zum Aufspalten langer Zeilen) an Ihre Shell und interpretiert es nicht. Es ist also deine Schale, die es interpretiert.

So dass Ihre Shell diese echo und printf Befehle ausführen. Und Shells wie bash oder zsh verwenden eingebaute Befehle für echo und printf (wenn Sie nicht sagen, den Befehl /bin/echo explizit zu verwenden).

Und es gibt einen Unterschied zwischen dem Verhalten der eingebauten Befehle zwischen den Shells. Außerdem können Sie eine Shell zum Ausführen interaktiver Befehle verwenden, und make verwenden Sie eine andere Shell (standardmäßig/bin/sh) für die Bearbeitung von Rezepten.

Hier ist ein Beispiel für den Unterschied zwischen den Schalen. Als ich in echo \\newcommand in bash laufen erhalte ich:

$ echo \\newcommand 
\newcommand 

Und wenn ich echo \\newcommand in zsh laufen erhalte ich:

$ echo \\newcommand 

ewcommand 

Ich vermute, dass Sie, weil es anderes Ergebnis zu bekommen. Und eigentlich muss printf '\\newcommand{\\coverheight}{11.0in}' richtiger sein, weil es starke Zitate verwendet.

Auf jeden Fall eine Möglichkeit, in Make-Datei zu drucken, scheint Echo mit externem Befehl/ist/werden:

all: 
     command echo '\\newcommand{\\coverheight}{11.0in}' > tmp 

Oder verwenden Sie starkes Zitat, wie Sie bereits getan haben:

all: 
     printf '\\newcommand{\\coverheight}{11.0in}' > tmp