![是否可以在 bash 中使用多个此处文档?](https://linux22.com/image/41049/%E6%98%AF%E5%90%A6%E5%8F%AF%E4%BB%A5%E5%9C%A8%20bash%20%E4%B8%AD%E4%BD%BF%E7%94%A8%E5%A4%9A%E4%B8%AA%E6%AD%A4%E5%A4%84%E6%96%87%E6%A1%A3%EF%BC%9F.png)
可以使用多个 here-docs 为 bash 中的命令提供输入吗?
$ cat <<<foo <<<bar
bar
$ cat <<EOF1 <<EOF2
> foo
> EOF1
> bar
> EOF2
bar
显然,在这两种情况下,第二个here-doc都用作标准输入,并替换第一个引用。解决办法是用echo
s代替吗?
$ 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 重定向到管道的另一端。
一旦将文件名传递给cat
,cat
就不再从标准输入读取。你需要:
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__