如何从Makefile执行SED命令



所以我试图在运行Raspbian的RaspberryPi上从Makefile运行sed命令。当我直接在终端中键入命令时,我使用的命令非常有效,但当我试图从Makefile中执行它们时,我得到了以下反馈:

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

您的问题是Makefile变量扩展看起来很像shell变量扩展。也就是说,如果Makefile中有一个单字母变量:

X=Some string

然后你引用这个变量,比如:

$X

因此,当您在一个构建节中有这样的命令时:

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

$i被make(使用空字符串)替换为,导致无效的CCD_ 2命令。您可以通过以下方式转义$来解决此问题:加倍:

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

Make中对此进行了讨论文档

最新更新