使用存储在变量中的HereDocument进行进程替换

时间:2017-08-22 11:50:56

标签: bash heredoc

我知道我可以使用bash的进程替换功能通过进程替换来指定文件参数,然后使用here文档来指定数据,如下所示:

foo --config <(cat <<EOF
# contents of config file
...
EOF
)

当我在同一个脚本中的两个不同位置需要相同的here文档时,将here文档存储在变量中会更有用。

我该怎么做:

read -r -d '' MY_CONFIG <<EOF
# contents of config file
...
EOF

那么如何调用foo$MY_CONFIG的内容传递给--config参数?

3 个答案:

答案 0 :(得分:2)

此外,您可以在流程替换中使用herestring

MY_CONFIG="hello world"
md5sum <( <<< "$MY_CONFIG" )

答案 1 :(得分:1)

我在写这个问题时遇到了解决方案。而不是使用<(cat ...),我们可以使用<(echo ...)从流程替换中编写内容。所以我们可以简单地使用:

foo --config <(echo "$MY_CONFIG")

测试这个的一个简单例子是:

MY_CONFIG="hello world"
less -f <(echo "$MY_CONFIG")

这应该打开更少,并在缓冲区中显示hello world

答案 2 :(得分:1)

我认为您发现自己的解决方案更简单,但为了完整起见,您可以通过here-docs来实现这一目标。

要在变量中存储here-doc,您可以使用(>是辅助提示字符串):

$ var=$(cat <<EOF
> line1
> line2
> EOF
> )
$ declare -p var
declare -- var="line1
line2"

然后,使用带有该变量内容的here-doc:

$ cat <<EOF
> $var
> EOF
line1
line2

即,对于你的情况,这样的事情:

$ foo --config <(cat <<EOF
> $var
> EOF
> )

正如我所说,仅使用<(echo "$var")<(printf '%s\n' "$var")显然更为简单。