bash 논리 OR 연산자가 GNU makefile에서 작동하지 않는 이유는 무엇입니까?

bash 논리 OR 연산자가 GNU makefile에서 작동하지 않는 이유는 무엇입니까?

다음 GNU make Makefile이 있습니다.


PWD := $(shell pwd)

obj-m += liason.o

default:
        bash -c '[ "$(lsmod|grep liason)" == "" ] || rmmod liason'
        make -C /src M=$(PWD) modules

makefile을 호출하면 출력에 다음이 표시됩니다.

bash -c '[ "" == "" ] ||  rmmod liason'

따라서 rmmod실행되지 않았습니다.

하지만:

모듈 "연락처"설치하다.
cmdline에서 다음 명령을 실행할 때도 나타납니다.

$ lsmod|grep liason
liason                 16384  0

lsmod|grep따라서 makefile 출력에서 ​​동일한 빈 따옴표는 의미가 없습니다.

답변1

$Make에 의해 처리 되는 동안 $(lsmod|grep liason)빈 문자열이 생성되고 명령이 실제로 실행되지 않습니다. 표현식을 셸에 전달하려면 다음을 두 배로 늘려야 합니다 $.

bash -c '[ "$$(lsmod|grep liason)" == "" ] || rmmod liason'

다음과 같이 단순화할 수 있습니다.

if lsmod | grep -q liason; then rmmod liason; fi

이렇게 하면 모듈을 제거하는 동안 오류가 발생하면 빌드가 중지됩니다.

관련 정보