我试图在构建过程中将数据附加到Debian软件包的描述中。所需的数据存储在debian/rules
文件中声明的常量中。
我已经覆盖了dh_gencontrol
并添加了@printf
调用来格式化数据。
我遇到的问题与包含空格的字符串有关:
printf
拆分给定的字符串,将每个单词匹配到%s
实例。我希望它使用整个字符串。- 我怎么能操纵说的字符串,用
_
替换空格,并将其添加到同一行?
debian/rules
:
TEXT_STRING = "string with data"
VERSION_NUM = "v11.4"
...
...
override_dh_gencontrol:
dh_gencontrol
@echo "Adding versions to debian/control file" # This one writes to console
@printf " %-30s %-20s %sn" "${TEXT_STRING// /_}" "${VERSION_NUM}" "${TEXT_STRING}" >> "$(CURDIR)/debian/my-package/DEBIAN/control"
预期输出:<Package description generated by dh_gencontrol>
string_with_data v11.4 string with data
实际输出:v11.4 string
with data
这里有两个主要问题:
-
Bash替换(即
解决方案是在(动态)shell会话中执行字符串操作,如下所示:"${TEXT_STRING// /_}"
)在make文件中不起作用。$(shell echo ${TEXT_STRING} | sed 's/ /_/g')
-
带空格的字符串分成单词列表。
printf
将它们视为多个变量,每个变量都是"消耗"的。单个%s
这将导致
printf
添加额外的行,直到打印所有变量。这是通过删除字符串的引号来解决的,把这个
"${TEXT_STRING}"
变成那个${TEXT_STRING}
。
最终的解决方案是:
@printf " %-30s %-20s %sn" $(shell echo ${TEXT_STRING} | sed 's/ /_/g') ${VERSION_NUM} ${TEXT_STRING} >> "$(CURDIR)/debian/my-package/DEBIAN/control"