Makefile multiline dash命令在分离的进程中运行可执行文件

我在我的makefile中有以下目标:(我想在分离的进程中运行python http server,并在bash脚本完成时终止服务器)

TEST_PORT = 17777
test::
    $(ENV_VARS) 
    python -m SimpleHTTPServer $(TEST_PORT); 
    PID=$$(lsof -t -i @localhost:$(TEST_PORT) -sTCP:listen); 
    echo $(PID); 
    if [ -n "$$PID" ]; 
    then 
        python test.py; 
    fi; 
    function finish { 
        if [ -n "$$PID" ]; 
        then 
            kill -9 $$PID; 
        fi 
    } 
    trap finish EXIT;

然而,当我把一个&python ...python ...我得到一个错误

/ bin / dash:语法错误:“;” 意外

如何以适当的方式做到这一点?

编辑

我已经改变了我的makefile来执行以下操作:

test::
    python -m SimpleHTTPServer $(TEST_PORT) &
    PID=$$(lsof -t -i @localhost:$(TEST_PORT) -sTCP:listen); 
        if [ -n "$$PID" ]; 
        then 
            $(ENV_VARS) python test.py; 
        fi 
        function finish { 
            if [ -n "$$PID" ]; 
            then 
                kill -9 $$PID; 
            fi 
        } 
        echo $$PID; 
        trap finish EXIT;

但是,我收到一个错误:(没有行号)

/ bin / dash:语法错误:单词意外


这里要记住的重要一点是,当shell看到命令时,换行符实际上不存在。

所以你的第一个命令变成:

$(ENV_VARS) python -m SimpleHTTPServer $(TEST_PORT); PID=$$(lsof -t -i @localhost:$(TEST_PORT) -sTCP:listen); echo $(PID); if [ -n "$$PID" ]; then python test.py; fi; function finish { if [ -n "$$PID" ]; then kill -9 $$PID; fi } trap finish EXIT;

你的第二个命令变成:

PID=$$(lsof -t -i @localhost:$(TEST_PORT) -sTCP:listen); if [ -n "$$PID" ]; then $(ENV_VARS) python test.py; fi function finish { if [ -n "$$PID" ]; then kill -9 $$PID; fi } echo $$PID; trap finish EXIT;

现在这些都很难阅读,所以我不指望你发现问题,但问题是你在几个地方缺少语句终止符。

特别:

  • 大括号( {} )是单词元素,因此需要围绕它们的空格(以及在右大括号之前和之后的终止符)。 你在这里失踪那些终结者fi } trap并在这里fi } echo

  • fi也不是语句终结符,因此它和下一个语句之间需要一个。 你在这里错过了一个test.py; fi function test.py; fi function (以及从第一点开始的括号中的test.py; fi function )。

  • 链接地址: http://www.djcxy.com/p/97107.html

    上一篇: Makefile multiline dash command run executable in a detached process

    下一篇: organize project and specify directory for object files in Makefile