【问题标题】:Makefile multiline dash command run executable in a detached processMakefile 多行破折号命令在分离的进程中运行可执行文件
【发布时间】:2015-10-10 17:38:32
【问题描述】:

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

【问题讨论】:

  • 当您完全省略 python ... 行时,您是否会遇到同样的错误? (以后你应该尽量准备最少的例子——我不会为了重现你的错误而乱用 python 和端口。)
  • 谢谢,我会考虑的。我绝对需要iffunction 和 python 命令的组合来演示正在发生的事情(不要错过细节)

标签: bash makefile dash-shell


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2013-09-23
    • 2013-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-20
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    相关资源
    最近更新 更多