오류가 어디서 발생했는지 모르겠습니다. 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 모두에서 문제 없이 실행되며 make
GNU 및 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 ;; \
쉘이 그러한 원시 카운트 파서를 사용하는 경우 변경 사항을 수용할 수 있어야 합니다.