Makefile 多行破折号命令 运行 可在分离进程中执行

Makefile multiline dash command run executable in a detached process

我的 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: Syntax error: ";" unexpected

如何以正确的方式做到这一点?

编辑

我更改了我的 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: Syntax error: word unexpected

这里要记住的重要一点是,当 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(以及第一点大括号中的那些)。