【问题标题】:How to execute SED command from Makefile如何从 Makefile 执行 SED 命令
【发布时间】:2025-12-20 05:20:18
【问题描述】:

所以我试图从运行 Raspbian 的 RaspberryPi 上的 Makefile 运行 sed 命令。当我将它们直接输入终端时,我正在使用的命令完美运行,但是当我尝试从 Makefile 执行它们时,我得到以下反馈:

sed: -e 表达式 #1, char 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

【问题讨论】:

  • 请显示上下文!
  • 我认为你应该逃避你的/ 字符。如果未定义 i,例如,我会在最后一行收到该错误。
  • 您可以通过准备minimal complete example 为我们节省大量工作。
  • 我觉得这个应该更清楚!

标签: bash sed makefile raspbian


【解决方案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 被替换为 make(使用空字符串),导致 无效的 sed 命令。您可以通过转义 $ 来解决此问题 加倍:

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

这是在in the Make documentation讨论。

【讨论】: