m4 макрос и перенаправление оболочки

Может ли макрос m4 выполнять перенаправление вывода в переменную с оболочкой $(...)? Переменная $MANPAGE_DOCBOOK_XSL пуста :(.

if test "x${XMLCATALOG}" != "x" -a "x$have_xmlcatalog_file" = "xyes"; then
    DOCBOOK_XSL_URI="http://docbook.sourceforge.net/release/xsl/current"
    DOCBOOK_XSL_PATH="manpages/docbook.xsl"
    MANPAGE_DOCBOOK_XSL=$(${XMLCATALOG} ${XML_CATALOG_FILE} ${DOCBOOK_XSL_URI}/${DOCBOOK_XSL_PATH} | sed -n 's|^file:/\+|/|p;q')
fi

https://github.com/pevik/ima-evm-utils/blob/master/m4/manpage-docbook-xsl.m4#L22

Глядя на аналогичный код в Wayland, они просто проверяют, работает ли команда (можно ли найти каталог), но не на значение.

https://github.com/wayland-project/wayland/blob/master/configure.ac#L167


person pevik    schedule 11.08.2020    source источник
comment
Что такое макрос m4? Все, что вы представили, выглядит как обычный шелл-код.   -  person John Bollinger    schedule 12.08.2020
comment
Посмотрите по ссылке: github .com/pevik/ima-evm-utils/blob/master/m4/. Вот и вопрос: тот макрос m4 правильный? Я думал, что можно использовать оболочку в макросах m4.   -  person pevik    schedule 12.08.2020
comment
Я не понимаю, что вас беспокоит. m4 — это язык макросов. Не будет слишком упрощенно сказать, что он преобразует ввод в вывод, расширяя макросы, которые он находит внутри. m4 не заботится о значимости его вывода для других программ или систем.   -  person John Bollinger    schedule 12.08.2020
comment
У вас возникли какие-то трудности с рассматриваемым кодом?   -  person John Bollinger    schedule 12.08.2020
comment
Посмотрите на github.com/pevik/ima-evm-utils/blob/travis/docker.debug/m4/ (при необходимости могу указать это в вопросе). Запуск echo "running (stdout only): ${XMLCATALOG} ${XML_CATALOG_FILE} ${DOCBOOK_XSL_URI}/${DOCBOOK_XSL_PATH}" печатает URI. Но когда я echo $MANPAGE_DOCBOOK_XSL, это пустой вывод. Таким образом, утверждение не работает. Что мне не хватает?   -  person pevik    schedule 12.08.2020
comment
Нам действительно нужен минимально воспроизводимый пример. Контекст, в котором раскрывается $MANPAGE_DOCBOOK_XSL, важен. Если приведенный выше фрагмент является единственным, связанным с тем, как эта переменная получает значение, то мои первые догадки будут заключаться в том, что она никогда не выполняется или что когда этот код выполняется, $XMLCATALOG не установлен или равен нулю, или значение $have_xmlcatalog_file не равно yes.   -  person John Bollinger    schedule 12.08.2020
comment
В любом случае, что касается основного вопроса, макросы m4 не выполняют подстановки команд, но это не имеет значения. m4, безусловно, может создавать сценарии оболочки, и именно так m4 используется Autoconf. Они могут абсолютно выполнять подстановки команд. Вы можете проверить сгенерированный скрипт configure в редакторе, чтобы убедиться, что этот фрагмент кода прошел неискаженным, и, в более общем плане, для устранения некоторых проблем Autoconf.   -  person John Bollinger    schedule 12.08.2020


Ответы (1)


В конце концов я обнаружил, что это неправильная часть sed (ничего волшебного в самой m4). Я отправил патч, который исправляет программное обеспечение:

https://patchwork.kernel.org/patch/11712861/

-       MANPAGE_DOCBOOK_XSL=$(${XMLCATALOG} ... | sed -n 's|^file:/\+|/|p;q')
+       MANPAGE_DOCBOOK_XSL=$(${XMLCATALOG} ... | sed 's|^file:/\+|/|')

Думаю, мне следует удалить этот вопрос как недействительный.

person pevik    schedule 13.08.2020