使用存储在变量中的 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" )
我知道我可以使用 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" )