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))
的类似目标也不起作用。
- 在确保它们的值首先来自以太网检查,然后来自 Wifi 检查后,如何在其他目标中使用变量
$(TVBOX_IP)
?
- 上面的 Makefile 目标有什么问题?
有时,将逻辑移至外部命令会更容易。使声明方式有时难以控制:
考虑替代方案:将条件移动到 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"
我有一个电视盒 运行 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))
的类似目标也不起作用。
- 在确保它们的值首先来自以太网检查,然后来自 Wifi 检查后,如何在其他目标中使用变量
$(TVBOX_IP)
? - 上面的 Makefile 目标有什么问题?
有时,将逻辑移至外部命令会更容易。使声明方式有时难以控制:
考虑替代方案:将条件移动到 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"