Как упоминается в другом ответе, вы должны использовать расширение GNU esyscmd
, чтобы иметь возможность получить выходные данные команды.Макрос syscmd
просто печатает прямо на стандартный вывод, игнорируя все макросы и divert
s.
Именно поэтому он выглядел так, как будто MODEL_ROOT
работал везде: это было, но только в очень простых ситуациях, когдаm4 не нужно было иметь дело с его выводом.
Однако, что касается цитаты:
include(MODEL_ROOT/sw/lib/m4_macros/foreach2.m4)
include(`MODEL_ROOT/sw/lib/m4_macros/foreach2.m4')
Это должно иметь перемещенные кавычки:
include(MODEL_ROOT`/sw/lib/m4_macros/foreach2.m4')
Кавычки предотвращают расширение макроса MODEL_ROOT
, поэтому они не должны заключать его здесь (где вы хотите, чтобы он был расширен).«Правильно» заключать в кавычки оставшуюся часть строки, потому что это не то, что вы захотите раскрыть макросами.
В качестве более надежного способа получить переменную среды изshell будет выглядеть примерно так:
define(`HOME', esyscmd(`printf \`\`%s\'\' "$HOME"'))
Это позволит избежать проблем, вызванных именами макросов, процентными знаками, обратными слешами, символами глобуса или пробелами в значении переменной среды.Единственное различие между этим и вашим решением заключается в добавлении \`\`%s\'\'
и кавычек вокруг переменной.
Предупреждение: esyscmd
всегда будет иметь расширенный вывод в виде макроса, поэтому его трудно сохранитьэто действительно санировано.Несмотря на то, что я использую символы кавычек, приведенные выше, они все равно сработают, если эти символы кавычек существуют в переменной среды.