我有一个程序,它从一个XML
文件中获取输入,该文件的路径被指定为参数。我希望我的 shell 脚本是独立的,所以这里的文档似乎是正确的方法。不幸的是,该程序不接受来自 的输入STDIN
,因此管道无法工作。
我读到here-docs 是作为文件实现的/tmp
,所以这让我认为可能有一种方法。
有没有办法将我的 XML 文件内联到我的 shell 脚本中,并获取该 xml 解析器可以使用的路径?
答案1
如果您的 shell 支持进程替换(bash、zsh、ksh88、ksh93),您可以使用:
your_command <( cat <<EOF
contents of the
xml file
EOF
)
整个<(...)
部分将命令的输出连接cat <<EOF
到 FIFO,然后将其作为参数传递给当前命令。
但我认为更便携的方法是,仅创建一个包含内容的临时文件,然后将其删除。
答案2
shell 实现此处文档的方式在 shell 之间有所不同,并且幕后使用的内容可能会根据运行时因素而有所不同。例如, shellbash
尝试使用 shell 进程内部的管道来处理短于系统管道大小的文档。
/dev/fd/0
您可以通过从大多数 Unix 系统读取或在大多数 Unix 系统上读取来访问标准输入流/dev/stdin
。这些不保证可用,但当今最常用的 Unix 系统都实现了它们。
使用这些路径名之一为您的命令提供路径名,同时在其标准输入流上提供数据应该可以解决您的问题。
thecommand /dev/stdin <<'END_XML'
Some XML document
goes here.
END_XML
/dev/stdin
只要您的命令不需要在给定文件中查找,这样使用就可以工作。如果是这样,您可能想暂时将输入写入实际文件:
tmpfile=$(mktemp) || exit
cat <<'END_XML' >"$tmpfile"
Some XML document
goes here.
END_XML
thecommand "$tmpfile"
rm "$tmpfile"
将此处文档与这些特殊路径名之一一起使用也是一种向其他命令提供临时输入的便捷方法,如
sed -f /dev/stdin file <<'END_SED'
Some sed script
goes here
END_SED
答案3
解释器可以很好地从正在解释的源中读取“此处”文档,并将其输入到获取输入的命令中(无论如何,这就是我要做的,以避免使用临时文件的麻烦)。无论如何,无论使用什么机制似乎都没有记录,因此可以随时更改。特别是,不能保证您获得的不同 shell/bin/sh
会以相同的方式工作。
答案4
一种方法是使用-
stdin 的简写形式和heredocs,如下所示
command - <<EOF
<file>
<contents />
</file>
EOF