Makefile에 파일이 있는지 확인하여 수있는 방법은 무엇입니까?
내 생존 Makefile
하기 전에 파일이 존재하는지 확인합니다. 이 코드를 사용하지만 오류가 발생합니다.
무슨 일이야?
if [ -a myApp ]
then
rm myApp
fi
이 오류 메시지가 나타납니다.
if [ -a myApp ]
/bin/sh: Syntax error: end of file unexpected (expecting "then")
make: *** [clean] Error 2
그러나 두 번째 상위 답변은 내용이 많은 것들의 이름과 내용이 ifeq
있습니다. 예를 들어 파일이 존재하지 않는 경우에만 파일을 다운로드하는 경우 다음 코드를 사용할 수 있습니다.
if fi
download:
ifeq (,$(wildcard ./glob.c))
curl … -o glob.c
endif
많은 사람들이 쉘 스크립팅을 사용하는 것을 보는 것이 이상합니다. 기본 makefile 구문을 사용하는 방법을 찾고 대상. 이 wildcard
기능을 사용하여 파일이 존재하는지 확인할 수 있습니다.
ifeq ($(UNAME),Darwin)
SHELL := /opt/local/bin/bash
OS_X := true
else ifneq (,$(wildcard /etc/redhat-release))
OS_RHEL := true
else
OS_DEB := true
SHELL := /bin/bash
endif
최신 정보 :
나는 아버지를 위해 일하는 방법을 찾았다.
ifneq ("$(wildcard $(PATH_TO_FILE))","")
FILE_EXISTS = 1
else
FILE_EXISTS = 0
endif
계속 앞으로 줄 끝에 백 슬래시가 필요할 수 있습니다. (아마도 버전에 따라 다름).
if [ -a myApp ] ; \
then \
rm myApp ; \
fi;
문제는 명령을 여러 줄로 나눌 때입니다. 따라서 \
위와 같이 계속해서 줄 끝에서 사용 하거나 &&
bash 의 연산자를 사용하여 한 줄로 모든 것을 얻을 수 있습니다 .
그런 다음 test
명령을 사용 하여 파일이 존재하는지 테스트 할 수 있습니다 ( 예 :
test -f myApp && echo File does exist
-f file
파일이 존재하고 일반 파일 인 경우 참입니다.
-s file
파일이 존재하고 크기가 0보다 크면 True입니다.
또는
test -f myApp || echo File does not exist
test ! -f myApp && echo File does not exist
는 test
에 해당하는 [
명령을 실행합니다.
[ -f myApp ] && rm myApp # remove myApp if it exists
원래 예제에서와 같이 작동합니다.
help [
또는 help test
추가 구문을 참조하십시오 .
또는 원하는대로 한 줄에 제안십시오 make
.
if [ -a myApp ]; then rm myApp; fi;
세미콜론 누락
if [ -a myApp ];
then
rm myApp
fi
그러나 확인하기 전에 존재 여부를 확인하고 가정합니다. 어떤 rm -f myApp
"강제"삭제를 사용할 수 있습니다 . 즉, 파일이 존재하지 않습니다.
FILE1 = /usr/bin/perl
FILE2 = /nofile
ifeq ($(shell test -e $(FILE1) && echo -n yes),yes)
RESULT1=$(FILE1) exists.
else
RESULT1=$(FILE1) does not exist.
endif
ifeq ($(shell test -e $(FILE2) && echo -n yes),yes)
RESULT2=$(FILE2) exists.
else
RESULT2=$(FILE2) does not exist.
endif
all:
@echo $(RESULT1)
@echo $(RESULT2)
실행 결과 :
bash> make
/usr/bin/perl exists.
/nofile does not exist.
한 줄 솔루션 :
[ -f ./myfile ] && echo exists
오류 조치가있는 한 줄 솔루션 :
[ -f ./myfile ] && echo exists || echo not exists
내 make clean
지시문에 사용 된 예 :
clean:
@[ -f ./myfile ] && rm myfile || true
그리고 make clean
항상 오류 메시지없이 작동합니다!
줄을 계속하기 위해 \를 사용하는 @ mark-wilkins의 답변과; 쉘에서 종료하거나 @kenorb에서 한 줄로 변경하는 것과 함께 문제를 해결합니다.
원래 문제에 대한 더 간단한 답이 있습니다 (@ alexey-polonsky가 지적했듯이). rm에 -f 플래그를 사용하여 오류가 발생하지 않도록합니다.
rm -f myApp
이것은 더 간단하고 빠르며 더 안정적입니다. 슬래시와 빈 변수로 끝나지 않도록주의하세요.
rm -f / $ (myAppPath)
# 절대로하지 않고
시스템이 삭제 될 수 있습니다.
test ! -f README.md || echo 'Support OpenSource!' >> README.md
"README.md가 계속 아무 작업도 수행하지 않고 계속 종료합니다."
&&
대신 사용 ||
하면 파일이 없을 때 오류가 발생합니다.
Makefile:42: recipe for target 'dostuff' failed
make: *** [dostuff] Error 1
'IT' 카테고리의 다른 글
DataGrid에서 선택한 행의 색상을 설정하는 방법 (0) | 2020.07.15 |
---|---|
boto3를 사용하여 s3의 버킷에 키가 있는지 확인하십시오. (0) | 2020.07.15 |
값을 기준으로 HashMap 정렬 (0) | 2020.07.15 |
MySQL 쿼리에서 DISTINCT와 COUNT를 함께 사용 (0) | 2020.07.15 |
: 'keytool'은 내부 또는 외부 명령, 작동 가능한 프로그램 또는 배치 파일로 인식되지 않습니다. (0) | 2020.07.15 |