我有一个变量,其中包含用 string 分隔的文件列表_NEWLINE_
。我需要将该变量输出到一个文件中,以便每个文件位于单独的行中。诀窍是它需要在 FreeBSD 和 Solaris 上运行。
这就是我现在正在尝试的:
echo "lib/alarms-1.2/priv/snmp_conf/agent.conf: lib/alarms/priv/snmp_conf/agent.conf_NEWLINE_lib/alarms-1.2/priv/snmp_conf/agent.conf.src: lib/alarms/priv/snmp_conf/agent.conf.src_NEWLINE_lib/alarms-1.2/priv/snmp_conf/community.conf: lib/alarms/priv/snmp_conf/community.conf" | sed 's|_NEWLINE_|\'$'\n|g'
这适用于 FreeBSD 和 Solaris 上的 shell。但是当在 Solaris 上的 GNUmakefile 中运行时,我得到了这个(注意每行末尾的 $):
lib/alarms-1.2/priv/snmp_conf/agent.conf: lib/alarms/priv/snmp_conf/agent.conf$
lib/alarms-1.2/priv/snmp_conf/agent.conf.src: lib/alarms/priv/snmp_conf/agent.conf.src$
lib/alarms-1.2/priv/snmp_conf/community.conf: lib/alarms/priv/snmp_conf/community.conf$
如果我\'$'
从 sed 中删除,那么它可以在 Solaris 上运行,但不能在 FreeBSD 上运行。也许有一种方法可以根据执行makefile的系统来告诉使用哪个版本?
编辑:感谢bobbogo 提出的解决方案,我创建了一个示例生成文件,它提供了所需的结果,并且似乎在 FreeBSD 和 Solaris 上都可以使用:
one-line := lib/alarms-1.2/priv/snmp_conf/agent.conf: lib/alarms/priv/snmp_conf/agent.conf_NEWLINE_lib/alarms-1.2/\
priv/snmp_conf/agent.conf.src: lib/alarms/priv/snmp_conf/agent.conf.src_NEWLINE_lib/alarms-1.2/priv/snmp_conf/comm\
unity.conf: lib/alarms/priv/snmp_conf/community.conf
many-lines := { echo '$(subst _NEWLINE_,' && echo ',${one-line})'; }
.PHONY: all
all:
$(shell $(many-lines) > test.txt)