Heredoc的、重定向和文件描述符

3

我知道这里有很多关于heredocs、重定向和文件描述符的帖子,但是似乎没有与我想要做的相关的内容。

我想打开一个文件描述符,将其指向一个文件,并向该文件描述符写入heredoc。

以下是我使用bash shell的代码:

exec 3>/tmp/testfile.txt
cat <<EOF>>3
write to fd using heredoc
EOF

我检查了我的文件,发现它是空的。我猜想这是因为在heredoc中引用文件描述符时会传输到位桶中。我尝试使用一个&符号像这样EOF>>&3,但这会在shell中引发错误。
我该如何完成此操作?
3个回答

4

如果你写:

echo something >> 3

这将创建一个名为filed的文件。如果你想引用文件描述符,需要使用&3语法。如果你想使用文件描述符追加到文件中,可以这样做:

exec 3>>/tmp/testfile.txt
cat <<EOF >&3
This is a test.
EOF

也就是说,当你使用exec语句打开文件描述符时,你可以决定是追加还是覆盖。如果你这样做:
exec 3>/tmp/testfile.txt

那样会覆盖文件而不是追加内容。

我在这里遇到了一个关于heredoc和重定向的问题。如果我打开一个文件描述符(fd3)来写入文件,那么其他写入STDOUT的函数是如何被写入文件描述符的呢? - todd1215
你需要展示其余代码的样子。最好是开一个新问题,因为注释并不适合用来展示代码。 - larsks
这是新发布的问题:http://stackoverflow.com/questions/31944900/stdout-output-getting-written-to-custom-file-descriptor - todd1215

2

好的,下面是答案:

exec 3>/tmp/testfile.txt
cat <<EOF 1>&3
this is a redirect to fd 3 via a heredoc
EOF

是的,没错。但你需要解释一下你在做什么。另外,请学会编写代码,然后通过选择它并使用编辑框上方的 {} 按钮进行缩进。这比使用用反引号括起来的“内联”代码更好看。它还允许您在 shell 脚本中编写反引号,尽管通常情况下您不应该使用那些。 - Jonathan Leffler
我想在这个例子中使用fd的原因是为了让函数轻松确定是否创建了fd,如果创建了就可以写入,否则不要尝试。我将它与其他几个函数一起使用,使用heredoc创建动态HTML文件。 - todd1215
那看起来非常像我说的。如果我的答案解决了你的问题,检查左侧的勾选框是礼貌的举止。 - larsks

0

追加重定向的Bash手册中写道:

The general format for appending output is:

[n]>>word

您追加到了文件3。但实际上,您并不需要使用>>运算符;您需要将cat的标准输出发送到描述符3:

cat <<EOF 1>&3
write to fd using heredoc
EOF

这不会截断文件,因此它仍然实现了“追加”的效果。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接