2016-07-27 11 views
0

Raspbianを実行しているRaspberryPiのMakefileからsedコマンドを実行しようとしています。私が使用しているコマンドは、ターミナルに直接入力すると完全に動作しますが、Makefileからコマンドを実行しようとすると、次のフィードバックが返されます。MakefileからSEDコマンドを実行する方法

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 
+1

状況を表示してください! –

+0

私は '/'の文字をエスケープするべきだと思います。 'i'が定義されていないと、最後の行にエラーが発生します。 –

+0

あなたは[最小限の完全な例](http://stackoverflow.com/help/mcve)を用意することによって、私たちに多くの仕事を節約することができます。 – Beta

答えて

1

問題は、Makefile変数の拡張がシェル変数の拡張とよく似ていることです。あなたがMakefileで一文字変数を持っている場合には、次のとおりです。あなたは、ビルドのいずれかで、このようなコマンドを持っているときに

$X 

X=Some string 

は、その後、あなたは次のように、この変数を参照してください。スタンザ:

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

これで解決しました!本当にありがとう! –

関連する問題