OpenBSD의 Makefile에서 명령문 디버깅

OpenBSD의 Makefile에서 명령문 디버깅

오류가 어디서 발생했는지 모르겠습니다. Makefile 코드는 다음과 같습니다.

platform_id = $$( uname -s )

platform = $$( \
    case $(platform_id) in \
        Linux | FreeBSD | OpenBSD | NetBSD ) echo $(platform_id) ;; \
        * ) echo Unrecognized ;; \
    esac )

Makefile의 첫 번째 대상은 다음과 같습니다.

check:
    echo $(platform); echo

Linux Mint 19.0과 FreeBSD 11.2 모두에서 문제 없이 실행되며 makeGNU 및 BSD로 테스트 되었습니다 make. 내 말은 두 시스템 모두에 gmake, 및 가 있다는 뜻입니다 bmake.

저는 OpenBSD 6.4를 처음 사용하는데 오류의 원인을 찾을 수 없어서 답답합니다.

이 명령의 오류 메시지는 다음과 같습니다.

echo $(  case $( uname -s ) in Linux | FreeBSD | OpenBSD | NetBSD ) echo $( uname -s ) ;; * ) echo Unrecognized ;;  esac ); echo
/bin/sh: syntax error: ';;' unexpected
*** Error 1 in /root (Makefile:47 'check')

게스트 추가 기능을 설치하지 않았으므로 복사해야 하지만 두 번 확인하면 정확해야 합니다.

답변1

사용중인 쉘 파서가 손상되었습니다 ...

배경: 구문 분석이 $(command)제대로 작동하려면 재귀 구문 분석기가 필요합니다.

완전한 표현식은 $(command)단일 문자열이어야 하며 command매우 복잡할 수 있습니다. 명령의 끝을 찾기 위해 최신 쉘은 파서를 재귀적으로 호출하고 첫 번째 중복 구문에서 중지되도록 합니다 ). mksh그런 다음 이진 구문 트리는 재귀 파서가 읽은 문자를 버퍼로 섞는 bosh동안 명령으로 다시 변환 됩니다.ksh93

(POSIX(실제로 ksh88)는 때때로 이것이 케이스 레이블 앞에 )추가된 요구 사항을 계산하고 추가하는 간단한 문자열 파서와 함께 사용될 수 있다고 믿습니다 .(

귀하의 명령이 POSIX에서 간주하는 것과 일치하지 않으므로 다음을 변경하여 다시 시도할 수 있습니다.

    Linux | FreeBSD | OpenBSD | NetBSD ) echo $(platform_id) ;; \

입력하다:

    ( Linux | FreeBSD | OpenBSD | NetBSD ) echo $(platform_id) ;; \

그리고

* ) echo Unrecognized ;; \

입력하다

( * ) echo Unrecognized ;; \

쉘이 그러한 원시 카운트 파서를 사용하는 경우 변경 사항을 수용할 수 있어야 합니다.

관련 정보