为什么 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)生成一个空字符串,命令实际上并未执行。要将表达式传递到 shell,您需要将以下内容加倍$

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

您可以将其简化如下:

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

这确保删除模块时出现任何错误都会停止构建。

相关内容