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

时间:2015-07-21 10:10:19

标签: bash makefile dash-shell

我的makefile中有以下目标:(我想在一个分离的进程中运行python http服务器,当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 ...时出现错误

  

/ 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:语法错误:单词意外

1 个答案:

答案 0 :(得分:2)

这里需要记住的重要一点是,当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 } trapfi } echo

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