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

Using process substitution with HereDocument that is stored in a variable

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

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参数呢?

我在写这个问题时想到了解决方案。而不是使用 <(cat ...),我们可以使用 <(echo ...) 从进程替换中写一些东西。所以我们可以简单地使用:

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

一个简单的测试示例如下:

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

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

我认为您发现自己的解决方案更简单,但为了完整起见,这里是您可以使用 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") 显然更简单。

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

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