如何从 Makefile 执行 SED 命令
How to execute SED command from Makefile
所以我正在尝试 运行 来自 RaspberryPi 运行ning Raspbian 上的 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 (空字符串),导致
无效的 sed
命令。您可以通过转义 $
来解决此问题
加倍:
sed -i -e '$$i /usr/local/bin/startlogging.sh > /var/log/thingLog/myThing 2>&1 & \n'
所以我正在尝试 运行 来自 RaspberryPi 运行ning Raspbian 上的 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 (空字符串),导致
无效的 sed
命令。您可以通过转义 $
来解决此问题
加倍:
sed -i -e '$$i /usr/local/bin/startlogging.sh > /var/log/thingLog/myThing 2>&1 & \n'