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

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

Tomcat Webアプリに何かをインストールしようとしています。これが私の目標の始まりです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

また修正する必要がありますか?

ベストアンサー1

$シンボルは変数マーカーとして解釈されるので、makefileで問題を引き起こすことは悪名高いです。ここでは、最初の行の値を2倍にします。

AppName\.html$$"

また、見ることができますその他の投稿makefile エスケープの問題の詳細をご覧ください。

おすすめ記事