1

ファイルの内容を同じシェル スクリプトに書き込むことによってファイルを渡すシェル スクリプトをいくつか見てきました。例えば:

if [[ $uponly -eq 1 ]]; then
    mysql $tabular -h database1 -u usertrack -pabulafia usertrack << END                                                                                           

    select host from host_status where host like 'ld%' and status = 'up';                                                                                          

END
     exit 0
fi

私が行うのと同様のことを行うことができました:

python << END
print 'hello world'
END

スクリプトの名前が言う場合、myscript.sh実行することで実行できますsh myscript.sh。目的の出力が得られます。

質問は、Makefile で同様のことを行うことはできますか? 私は周りを見回してきましたが、彼らは皆、私が次のようなことをしたと言います:

target:
        python @<<
print 'hello world'
<<

しかし、それはうまくいきません。

ここに私が探していたリンクがあります:

http://www.opussoftware.com/tutorial/TutMakefile.htm#Response%20Files

http://www.scribd.com/doc/2369245/Makefile-Memo

4

2 に答える 2

4

次のようなことができます。

define TMP_PYTHON_PROG
print 'hello'
print 'world'
endef

export TMP_PYTHON_PROG
target:
    @python -c "$$TMP_PYTHON_PROG"

まず、 と を使用して複数行の変数を定義していdefineますendef。次に、シェルにそれを行う必要がありexportます。そうしないと、新しい各行が新しいコマンドとして扱われます。次に、を使用してシェル変数を再挿入します$$

于 2012-06-21T00:45:33.807 に答える
3

あなたのことがうまくいかなかった理由@<<は、それが非標準のmakeバリアントの機能であるように見えるからです. 同様に、definemVChr が言及しているコマンドは (私が知る限り) GNU Make に固有のものです。GNU Make は非常に広く配布されていますが、このトリックは BSD make や POSIX 専用 make では機能しません。

一般的な原則として、メイクファイルを可能な限り移植可能にしておくのは良いことだと思います。また、autoconf を使用するシステムのコンテキストで Makefile を作成している場合は、さらに重要です。

探していることを実行するための完全に移植可能な手法は次のとおりです。

target:
    { echo "print 'First line'"; echo "print 'second'"; } | python

または同等に、物事をもう少しきちんとレイアウトしたい場合:

target:
    { echo "print 'First line'"; \
      echo "print 'second'"; \
    } | python
于 2012-06-21T12:35:03.323 に答える