1

彼、
ファイルの内容 (相対ファイル パスを含む) を変数に読み取り、ファイル内のすべての行にパスをプレフィックスとして付けたいと考えています。次に、これらすべてのファイルをディレクトリにコピーします。このような:

$(httpd_DIR)/my.tar: $(mypath)/html.txt
    rm -rf web
    mkdir -p web
    VV = $(addprefix $(httpd_DIR)/, $(shell cat $(mypath)/html.txt) )
    cp -R $$VV $(httpd_DIR)/web
    $(TAR) -C $(httpd_DIR) -cvf $(httpd_DIR)/web.tar web


$(mypath)/html.txt ファイルには、次のような相対ファイル パスのリストが含まれています:
dir1/file1.html
dir2/file2.html
dir3/file3.html

何らかの理由で次のエラーが発生します:
/bin/bash: VV : コマンドが見つかりません

VV を実行しようとしているわけではないのに、なぜ het がこのエラーを出すのでしょうか?
cp コマンドのコメントを外しても、同じエラーが発生することに注意してください... Linux PC で GNU make を使用しています。

4

1 に答える 1

2

ここにはいくつかの問題があります。

VV = $(addprefix $(httpd_DIR)/, $(shell cat $(mypath)/html.txt) )

使用しているシェルを教えてくれなかったので、bash だと仮定します。

bash で変数を割り当てたい場合は、空白に注意する必要があります:VV=fooは有効であり、期待どおりの動作をしますが、 と入力VV = fooすると、シェルは最初の単語「VV」をコマンドとして解釈し、ボークします。と入力VV=foo barすると、シェルは に割り当てfooてからVV、コマンドに抵抗しbarます。代わりに使用できますVV="foo bar"

次に、別の問題に遭遇します。各コマンドは独自のサブシェルで実行されるため、1 つのコマンドで割り当てられた変数は次のコマンドには適用されません。

VV=foo
echo $$VV # this will echo a blank

次のように、コマンドを組み合わせる必要があります。

VV=foo ; echo $$VV # this will echo foo

またはこれ:

VV=foo ; \
  echo $$VV # this will echo foo

(最初の行の前にタブが 1 つしかないことに注意してください。)

一般に、実際のコマンドをプラグインする前に、考えられる最も単純なコマンドでこれらの構成をテストする必要があります。そうすれば、これらのバグを見つけやすくなります。

于 2012-12-13T14:44:53.793 に答える