2016-07-27 285 views
0

所以我試圖從運行Raspbian的RaspberryPi上的Makefile運行sed命令。我使用的命令直接輸入到終端時非常有效,但是當我嘗試從Makefile執行它們時,我收到以下反饋:如何從Makefile執行SED命令

sed:-e表達式#1,字符14:命令

# 
# Quick and dirty Makefile for logsnag 
# 

CC  = gcc 

INCLUDE  = -I. 

CFILES  = myThing.c 
OBJS  = myThing.o 

CFLAGS   = ${INCLUDE} 

all: myThing 

myThing: ${OBJS} 
    ${CC} ${CFLAGS} ${OBJS} -o myThing 

myThing.o: ${CFILES} 
    ${CC} ${CFLAGS} myThing.c -c 

install: myThing 
    sudo cp -f myThing/usr/local/bin 
    sudo cp -f ../bin/startlogging.sh /usr/local/bin 
    sudo cp -f ../cfg/rotateThing.cfg /etc 

    if [ ! -d /var/log/thingLog ]; then\ 
     sudo mkdir /var/log/thingLog;\ 
    fi; 

    sudo sed -i -e '$i touch /var/log/thingLog/thing.log /var/log/thingLog/myThing \n' /etc/rc.local; 
    sudo sed -i -e '$i logrotate -f /etc/rotateThing.cfg \n' /etc/rc.local; 
    sudo sed -i -e '$i touch /var/log/thingLog/thing.log /var/log/thingLog/myThing \n' /etc/rc.local; 
    sudo sed -i -e '$i /usr/local/bin/startlogging.sh > /var/log/thingLog/myThing 2>&1 & \n' /etc/rc.local; 

clean: 
    rm -f myThing *.o 
+1

請顯示上下文! –

+0

我想你應該逃避你的'/'字符。如果'i'沒有定義,我會在最後一行發現錯誤。 –

+0

您可以通過準備[最小完整示例](http://stackoverflow.com/help/mcve)爲我們節省大量工作量。 – Beta

回答

1

您的問題是,Makefile變量擴展看起來很像shell變量擴展。也就是說,如果你有一個Makefile單字母變量:

X=Some string 

然後,你指的是這樣的變量:

$X 

所以,當你在構建一個有這樣的命令節:

sed -i -e '$i /usr/local/bin/startlogging.sh > /var/log/thingLog/myThing 2>&1 & \n' 

$i該得到由使(用空字符串)代替,導致 一個inval id sed命令。您可以通過逃避$通過 加倍它解決這個問題:

sed -i -e '$$i /usr/local/bin/startlogging.sh > /var/log/thingLog/myThing 2>&1 & \n' 

這是討論in the Make documentation

+0

這解決了它!非常感謝! –