Вам нужно сначала сохранить значение в переменной оболочки:
MINOR_VERSION := $(shell v='$(FULL_VERSION)'; echo "$${v%.*}")
(при условии, что $(FULL_VERSION)
не содержит одинарных кавычек)
Теперь это вызывает sh
, а не bash
. ${var%pattern}
является стандартным sh
оператором (происходит отksh
).
Если вы хотите использоватьbash
-конкретных операторов, вам нужно указать make
, чтобы он звонил bash
вместо sh
с помощью
SHELL = bash
Однако имейте в виду, что на многих системах bash
не установлено по умолчанию, что сделало бы ваш Makefile не -переносимым (, но с другой стороны, на некоторых системах также нет GNU make
, и вы уже используя там некоторые GNU-измы )).
Я всегда находил и --syn
, и --ctstate NEW
избыточными, потому что у меня есть -m state --state INVALID -j DROP
в качестве первого правила для всех соответствующих цепочек.
Возможно, вы хотите быть пуристом и следовать стеку TCP/IP до буквы, что означает, что только новое соединение должно быть --syn
, т. е. вы не можете отправить пакет SYN в рамках уже установленного соединения, потому что для завершения это вы должны использовать FIN
.