/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
make
sh
\
ここではコードに含めたいが拡張されずにコードに渡されることを望んでいるので、二重引用$$MYTEXT
符$MYTEXT
が拡張されないようにするには、内部に二重引用符を使用するか、単一引用符を使用する必要があります。とにかく、あなたはそれを拡張したいので、コードに一重引用符を使用したくありません。sh
$MYTEXT
sh
bash
\
bash
$MYTEXT
$MYTEXT
bash
だから:
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
サブシェルは、呼び出しを実行しているプロセスの作業ディレクトリのみを変更し、後で別のコマンドを実行して実行される他のシェルの作業ディレクトリには影響しません。ここでは必要ありません(...)
。cd
sh
make
答え2
スクリプトをインポートしてmakeの外で実行します。
- 実行する
shellcheck
- 試験を受ける
引用符に何か問題があることがわかります。