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
(以及第一点大括号中的那些)。
我的 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
(以及第一点大括号中的那些)。