xslt shbang:从命令行使用 xslt

Att*_*igh 3 scripting xml executable shebang interpreter

我已经(愚蠢地?)写了几个中等通用的xslt 脚本。

我很想将这些转换为从标准输入或类似内容读取 xml 文档的可执行文件。

使用其他语言执行此操作的方法是使用shbang

有没有一种简单/标准的方法可以用 xsltproc 和朋友来做到这一点?当然,我可以在 xsltproc 周围编写一个包装器,从第一条注释行开始……但如果有一些接近标准的东西,这会更好用。

meu*_*euh 5

您可以使用通用binfmt-misc内核模块来处理运行可执行文件时使用的解释器。它通常用于允许您运行外部架构文件而无需使用qemu或作为前缀wine,但可用于识别文件头中的任何魔术字符序列,甚至是给定的文件扩展名,如*.xslt. 请参阅内核文档

例如,如果您有一个demo.xslt以字符开头的文件

<xsl:stylesheet version=...
Run Code Online (Sandbox Code Playgroud)

您可以要求模块识别<xsl:stylesheet文件中偏移量 0 处的字符串,并/usr/bin/xsltproc以 root 身份运行

colon=$(printf '\\x%02x' \':) # \x3a
echo ":myxsltscript:M::<xsl${colon}stylesheet::/usr/bin/xsltproc:" >/etc/binfmt.d/myxslt.conf 
cat /etc/binfmt.d/myxslt.conf >/proc/sys/fs/binfmt_misc/register
Run Code Online (Sandbox Code Playgroud)

/etc除非您希望在重新启动时保留设置,否则您不需要通过该文件。如果您没有该/proc文件,则需要先挂载它:

mount binfmt_misc -t binfmt_misc /proc/sys/fs/binfmt_misc
Run Code Online (Sandbox Code Playgroud)

现在,如果您chmod +x demo.xslt可以demo.xslt使用任何参数运行xsltproc,它将使用demo.xslt作为额外第一个参数提供的文件名运行。

要撤消设置,请使用

echo -1 >/proc/sys/fs/binfmt_misc/myxsltscript
Run Code Online (Sandbox Code Playgroud)