3

私のメイクファイルには次のターゲットがあります: (デタッチされたプロセスで 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;

&ただし、行の後に a を置くとpython ...、エラーが発生します

/bin/dash: 構文エラー: ";" 予期しない

これはどのように適切な方法で行うことができますか?

編集

次のようにメイクファイルを変更しました。

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: 構文エラー: 予期しない単語

4

1 に答える 1

2

ここで覚えておくべき重要なことは、シェルがコマンドを認識したときに改行が実際には存在しないということです。

したがって、最初のコマンドは次のようになります。

$(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;

2 番目のコマンドは次のようになります。

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もステートメントターミネータではないため、それと次のステートメントの間に 1 つ必要です。ここには 1 つ欠けていますtest.py; fi function(最初の点の中括弧内のものも同様です)。

于 2015-07-21T12:22:28.527 に答える