Вот мой пример того, как большой bash-скрипт можно разделить на несколько файлов, а затем встроить в один результирующий скрипт:https://github.com/zinovyev/bash-project
Для этой цели я использую Makefile
:
TARGET_FILE = "target.sh"
PRJ_SRC = "${PWD}/src/main.sh"
PRJ_LIB = $(shell ls -d ${PWD}/lib/*) # All files from./lib
export PRJ_LIB
SHELL := /bin/env bash
all: define_main add_dependencies invoke_main
define_main:
echo -e "#!/usr/bin/env bash\n" > ${TARGET_FILE}
echo -e "function main() {\n" >> ${TARGET_FILE}
cat "${PRJ_SRC}" | sed -e 's/^/ /g' >> ${TARGET_FILE}
echo -e "\n}\n" >> ${TARGET_FILE}
invoke_main:
echo "main \$$@" >> ${TARGET_FILE}
add_dependencies:
for filename in $${PRJ_LIB[*]}; do cat $${filename} >> ${TARGET_FILE}; echo >> ${TARGET_FILE}; done
По-видимому, LPF относится к Linux Packet Filter:https://gitlab.isc.org/isc-projects/dhcp/-/blob/master/common/lpf.c
В других контекстах он также известен как Linux Socket Filtering или Berkeley Packet Filter.
DHCP-клиент должен иметь возможность отправлять и получать широковещательные UDP-пакеты, а сетевой интерфейс еще не обязательно имеет настроенный IP-адрес. Он также должен заботиться о том, через какой интерфейс будут проходить пакеты, чтобы назначить сетевую конфигурацию конкретному сетевому интерфейсу, на который они были получены, а не просто любому интерфейсу в системе, в которой их больше одного.
API-интерфейс фильтрации пакетов -, такой как LPF в Linux, является наиболее гибким и эффективным способом для программного обеспечения DHCP сообщить сетевому стеку ОС :«Я собираюсь использовать сокет необработанных пакетов, потому что моя сеть потребности в трафике немного необычны, но я по-прежнему не хочу получать копию каждого отдельного пакета , поступающего через сетевой интерфейс -, только пакеты UDP на эти конкретные номера портов».
Если LPF или аналогичный пакетный -фильтр API недоступен, программное обеспечение DHCP должно полагаться на стандартные сетевые сокеты API и его различные расширения -, особенно параметры сокетов. Но они не единообразно поддерживаются во всех операционных системах, поддерживаемых набором ISC DHCP, поэтому код сокетов ISC DHCP довольно сложен и полон #ifdef
с.
Если нет ни API фильтра пакетов -, ни конкретных доступных параметров сокета,пакет DHCP может работать правильно, только если хост имеет только один сетевой интерфейс:
#if !defined(SO_BINDTODEVICE) && !defined(USE_FALLBACK)
/* Make sure only one interface is registered. */
if (once) {
log_fatal ("The standard socket API can only support %s",
"hosts with a single network interface.");
}
once = 1;
#endif
Когда используется API-интерфейс фильтрации пакетов -, набор ISC DHCP также устанавливает резервный сокет с использованием стандартного API-интерфейса сетевых сокетов. На принимающей стороне резервный сокет просто отбрасывает весь входящий трафик :, возможно, какой-то пакетный -фильтр API создаст копию входящего трафика, и для обеспечения ОС не будет думать, что порт UDP, используемый для DHCP, закрыт, и вызовет отправку сообщений об ошибках ICMP для любых полученных одноадресных пакетов DHCP (, т. е. обновления существующей активной аренды ).
На стороне отправки использование резервного сокета менее очевидно. Если кто-то еще знает больше, не стесняйтесь редактировать этот ответ или добавлять свой собственный.