2016-07-27 286 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

这解决了它!非常感谢! –