Makefile 评估 2 个变量然后使用非空变量

Makefile evaluate 2 variables then use the non-empty one

我有一个电视盒 运行 CoreELEC(一个类似于 LibreELEC 的 Linux 发行版),我想找到它的 IP 地址然后使用 SSH 登录它。

我知道以太网接口和 Wifi 接口的 MAC 地址。

我想在我的局域网(以太网或 Wifi)中找到我的电视盒的 IP 地址,假设我不知道电视盒当前使用哪个接口连接到局域网。

以下目标列表不起作用,因为它在评估 "OR" 时失败:

TVBOX_IP=""

find-tvbox-eth-ip:
    @echo Checking the Ethernet IP address...
    $(eval TVBOX_ETH_IP=$(shell sudo arp-scan 192.168.0.1/24 2>&1 | grep $(TV_ETH_MAC) | awk '{print $}'))
    @echo Found an Ethernet IP address: "$(TVBOX_ETH_IP)"

find-tvbox-wifi-ip:
    @echo Checking the Wifi IP address...
    $(eval TVBOX_WIFI_IP=$(shell sudo arp-scan 192.168.0.1/24 2>&1 | grep $(TV_WLAN_MAC) | awk '{print $}'))
    @echo Found a Wifi IP address: "$(TVBOX_WIFI_IP)"

find-tvbox-ip: find-tvbox-eth-ip find-tvbox-wifi-ip
    @[ "$(TVBOX_ETH_IP)" ] && TVBOX_IP:=$(TVBOX_ETH_IP) || ( echo TVBOX_IP:=$(TVBOX_WIFI_IP) )
    @echo "Stored this IP for the TV BOX: " $(TVBOX_IP)

包含 TVBOX_IP := $(or $(TVBOX_ETH_IP),$(TVBOX_WIFI_IP)) 的类似目标也不起作用。

有时,将逻辑移至外部命令会更容易。使声明方式有时难以控制:

考虑替代方案:将条件移动到 shell。

  # Notice this is definition, will not force immediate evaluation
TVBOX_ETH_IP= sudo arp-scan 192.168.0.1/24 2>&1 | grep $(TV_ETH_MAC) | awk '{print $}'
TVBOX_WIFI_IP=sudo arp-scan 192.168.0.1/24 2>&1 | grep $(TV_WLAN_MAC) | awk '{print $}'

find-tvbox-ip:
    IP=$$(${TVBOX_ETH_IP}) ; [ "$$IP" ] || IP=$$(${TVBOX_WIFI_IP}) ; echo "IP=$$IP"

或者保持条件在 make $(or ...)

TVBOX_ETH_IP=$(shell sudo arp-scan 192.168.0.1/24 2>&1 | grep $(TV_ETH_MAC) | awk '{print $}')
TVBOX_WIFI_IP=$(shell sudo arp-scan 192.168.0.1/24 2>&1 | grep $(TV_WLAN_MAC) | awk '{print $})'

TVBOX_IP=$(or ${TVBOX_ETH_IP}, ${TVBOX_ETH_IP})

find-tvbox-ip:
    IP=${TVBOX_IP} ; echo "IP=$$IP"