web-dev-qa-db-ja.com

コマンド結果をmakefileターゲット内の変数に入れます

Tomcatwebappに何かをインストールしようとしています。これは私のinstallターゲットの始まりです:

Tomcat=`locate --regex "^(/var/lib/Tomcat[0-9]{1,2}/webapps/[^/]+/)AppName\.html$" -l 1 | tr -d "\n"`
echo "Tomcat: $Tomcat"
# If the string is empty (no path matched) or the path does not exists (that should never really happen)
# terminate
if [ -z "$Tomcat" ] || [ ! -f "$Tomcat" ]; then 
  echo "Application not found on filesystem."
  exit 404
fi

ただし、これは出力です。

Tomcat=`locate --regex "^(/var/lib/Tomcat[0-9]{1,2}/webapps/[^/]+/)AppName\.html -l 1 | tr -d "\n"`
/bin/sh: 1: Syntax error: Unterminated quoted string
makefile:77: recipe for target 'install' failed
make: *** [install] Error 2

他の誰もが、`(バッククォート)を使用してコマンドstdout出力を変数に割り当てることができると主張しています。 tr -d "\n"を使用して、すべての改行文字を削除しました。表示される場合があります。そして、コードはシェルで完璧に機能します:

XXXXX@debianvirtualbox:~$ Tomcat=`locate --regex "^(/var/lib/Tomcat[0-9]{1,2}/webapps/[^/]+/)AppName\.html$" -l 1 | tr -d "\n"`
XXXXX@debianvirtualbox:~$ echo $Tomcat
/var/lib/Tomcat8/webapps/websight/AppName.html

他に修正するものはありますか?

$記号は、変数マーカーとして解釈されるため、makefileで問題を引き起こすことで有名です。ここでは、最初の行の1つを2倍にするだけで、うまくいくはずです。

AppName\.html$$"

また、メイクファイルのエスケープの問題について詳しくは、 その他の投稿 もご覧ください。

4
klimpergeist