用于传递定界符的多行语法;这是便携式的吗?

发布于 2024-11-29 08:56:34 字数 237 浏览 2 评论 0原文

我熟悉这种语法:

cmd1 << EOF | cmd2
text
EOF

但刚刚发现 bash 允许我编写:

cmd1 << EOF |
text
EOF
cmd2

(heredoc 用作 cmd1 的输入,cmd1 的输出通过管道传输到 cmd2)。这看起来是一个非常奇怪的语法。它是便携式的吗?

I'm familiar with this syntax:

cmd1 << EOF | cmd2
text
EOF

but just discovered that bash allows me to write:

cmd1 << EOF |
text
EOF
cmd2

(the heredoc is used as input to cmd1, and the output of cmd1 is piped to cmd2). This seems like a very odd syntax. Is it portable?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

回眸一遍 2024-12-06 08:56:34

是的,POSIX 标准允许这样做。 根据2008年版本:

此处文档应被视为以以下方式开始的单个单词:
下一个 并继续,直到有一行仅包含
分隔符和 ,中间没有 字符。
然后下一个此处文档开始(如果有的话)。

并在同一行中包含多个“此处文档”的示例:

cat <<eof1; cat <<eof2
Hi,
eof1
Helene.
eof2

因此,进行重定向或管道是没有问题的。您的示例类似于以下内容:

cat file |
cmd

shell 语法(链接页面的下方)包含以下定义:

pipe_sequence    :                             command
                 | pipe_sequence '|' linebreak command

newline_list     :              NEWLINE
                 | newline_list NEWLINE
                 ;
linebreak        : newline_list
                 | /* empty */

因此管道符号后面可以跟有行尾,并且仍然被视为管道的一部分。

Yes, the POSIX standard allows this. According to the 2008 version:

The here-document shall be treated as a single word that begins after
the next <newline> and continues until there is a line containing only
the delimiter and a <newline>, with no <blank> characters in between.
Then the next here-document starts, if there is one.

And includes this example of multiple "here-documents" in the same line:

cat <<eof1; cat <<eof2
Hi,
eof1
Helene.
eof2

So there is no problem doing redirections or pipes. Your example is similar to something like this:

cat file |
cmd

And the shell grammar (further down on the linked page) includes these definitions:

pipe_sequence    :                             command
                 | pipe_sequence '|' linebreak command

newline_list     :              NEWLINE
                 | newline_list NEWLINE
                 ;
linebreak        : newline_list
                 | /* empty */

So a pipe symbol can be followed by an end-of-line and still be considered part of a pipeline.

白馒头 2024-12-06 08:56:34

是的,它在 POSIX shell 语法中。您还可以同一命令有多个here-doc(其他一些示例使用两个cat调用,但这也有效):

cat <<EOF1 <<EOF2
first here-doc
EOF1
second here-doc
EOF2

这是人为的(使用2这里-docs for stdin),但如果您考虑为不同的文件描述符提供输入,它立即有意义。

还可以完全丢弃。为什么不让此处文档直接可供 cmd 使用:

cmd << EOF
input
here
EOF

Yes it's in the POSIX shell grammar. You can also have more than one here-doc for the same command (some other examples use two cat invocations, but this works as well):

cat <<EOF1 <<EOF2
first here-doc
EOF1
second here-doc
EOF2

This is contrived (using 2 here-docs for stdin), but if you think of providing input for different file descriptors it immediately makes sense.

There's also the possibility to drop the cat entirely. Why not make the here-document directly available to cmd:

cmd << EOF
input
here
EOF
围归者 2024-12-06 08:56:34

嗯,我想是的,根据 POSIX 模式下 bash 的测试:

$ bash --posix
$ cat <<EOF |
> ahoj
> nazdar
> EOF
> sed 's/a/b/'
bhoj
nbzdar

Hmm, I suppose yes, according to the test in bash in POSIX mode:

$ bash --posix
$ cat <<EOF |
> ahoj
> nazdar
> EOF
> sed 's/a/b/'
bhoj
nbzdar
往事风中埋 2024-12-06 08:56:34

嗨,请检查一下

#!/bin/sh
( base32 -d | base64 -d )<<ENDOFTEXT
KNDWW42DNNSHS5ZXPJCG4MSVM5MVQVT2JFCTK3DELBFDCY2IIJYGE2JUJNHWS22LINVHQMCMNVFD
CWJQIIZVUV2JOVNEOVJLINTW6PIK
ENDOFTEXT

问候

Hi, check this, for example

#!/bin/sh
( base32 -d | base64 -d )<<ENDOFTEXT
KNDWW42DNNSHS5ZXPJCG4MSVM5MVQVT2JFCTK3DELBFDCY2IIJYGE2JUJNHWS22LINVHQMCMNVFD
CWJQIIZVUV2JOVNEOVJLINTW6PIK
ENDOFTEXT

regards

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文