是否可以在 bash 中使用多个此处文档?

是否可以在 bash 中使用多个此处文档?

可以使用多个 here-docs 为 bash 中的命令提供输入吗?

$ cat <<<foo <<<bar
bar
$ cat <<EOF1 <<EOF2
> foo
> EOF1
> bar
> EOF2
bar

显然,在这两种情况下,第二个here-doc都用作标准输入,并替换第一个引用。解决办法是用echos代替吗?

$ cat <(echo -n foo) <(echo bar)
foobar

另外,由于某种原因,使用组合对我来说不起作用。为什么会这样呢?

$ cat <<<foo <(echo bar)
bar
$ cat <(echo -n foo) <<<bar
foo

答案1

你可以做:

cat /dev/fd/3 3<< E1 /dev/fd/4 4<< E2
foo
E1
bar
E2

只能有一个标准输入,因为只有一个文件描述符 0。

cat << EOF
eof
EOF

是缩写:

cat /dev/fd/0 0<< EOF
eof
EOF

和:

cat <<< foo

是:

cat /dev/fd/0 0<<< foo

您必须决定在文件描述符 0 上打开什么。

cat <(echo foo)

是:

cat /dev/fd/123

其中123是管道的文件描述符,同时,bashecho foo在另一个进程中运行,并将 stdout 重定向到管道的另一端。

一旦将文件名传递给catcat就不再从标准输入读取。你需要:

cat <(echo foo) /dev/fd/0 << EOF
bar
EOF

或者:

cat <(echo foo) - << EOF
bar
EOF

-是告诉cat从标准输入读取)。

答案2

使用多个cat

cat <<'__END_OF_USAGE__'; cat <<__END_OF_TOOLS__

Usage of the script: ...
This section does not expand parameters.

__END_OF_USAGE__

Here's a list of tools provided by this script:

$(grep -F tools <"$0")

__END_OF_TOOLS__

相关内容