명령 결과를 makefile 대상의 변수에 넣습니다.

명령 결과를 makefile 대상의 변수에 넣습니다.

Tomcat 웹앱에 무언가를 설치하려고 합니다. 이것이 내 목표의 시작입니다 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에서 문제를 일으키는 것으로 악명이 높습니다. 여기에서는 첫 번째 행의 값을 두 배로 늘립니다.

AppName\.html$$"

당신은 또한 볼 수 있습니다다른 게시물makefile 이스케이프 문제에 대해 자세히 알아보세요.

관련 정보