Makefile サブシェルの Bash 変数の置換

Makefile サブシェルの Bash 変数の置換

/tmp/file私のMakefileは、次を使用してDockerコンテナ内にファイルを生成する必要があり、実際に作成しますmake test

test:   
    (cd subdirectory && docker-compose exec webserver bash -c "\
        MYTEXT=hello && \
        echo 'this is $$MYTEXT world' > /tmp/file && \
        cat /tmp/file
    ")

しかし、これは期待どおりに機能しませんでした。/tmp/file内容があります:

this is  world

でもそうだったらいいな

this is hello world

MYTEXTを次のコマンド(echo)に渡すには?

ベストアンサー1

makeコードを解釈するためにsh(デフォルトで変数を変更しない限り)呼び出されます(各行の終わりで使用されない限り、1行に1回)。SHELL makesh\

ここではコードに含めたいが拡張されずにコードに渡されることを望んでいるので、二重引用$$MYTEXT$MYTEXTが拡張されないようにするには、内部に二重引用符を使用するか、単一引用符を使用する必要があります。とにかく、あなたはそれを拡張したいので、コードに一重引用符を使用したくありません。sh$MYTEXTshbash\bash$MYTEXT$MYTEXTbash

だから:

test:   
    (cd subdirectory && \
      docker-compose exec webserver bash -c '\
        MYTEXT=hello && \
        echo "this is $$MYTEXT world" > /tmp/file && \
        cat /tmp/file \
      '\
    )

を実行すると、strace -s999 -fe execve make次の内容が表示されます(ここでdocker-compose exec webserver bash置き換えられますbash)。

[pid 22370] execve("/bin/sh", ["/bin/sh", "-c", "(cd subdirectory && \\\n  exec bash -c '\\\n    MYTEXT=hello && \\\n    echo \"this is $MYTEXT world\" > /tmp/file && \\\n    cat /tmp/file \\\n  '\\\n)"], 0x555ce503e620 /* 52 vars */) = 0
strace: Process 22371 attached
[pid 22371] execve("/bin/bash", ["bash", "-c", "\\\n    MYTEXT=hello && \\\n    echo \"this is $MYTEXT world\" > /tmp/file && \\\n    cat /tmp/file \\\n  "], 0x563430f3e8f8 /* 52 vars */) = 0
[pid 22371] execve("/bin/cat", ["cat", "/tmp/file"], 0x55e9509edc10 /* 52 vars */) = 0
this is hello world

サブシェルは、呼び出しを実行しているプロセスの作業ディレクトリのみを変更し、後で別のコマンドを実行して実行される他のシェルの作業ディレクトリには影響しません。ここでは必要ありません(...)cdshmake

おすすめ記事