可以使用多个 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__