Lov*_*ths 2 linux cat here-document
我是 Linux、shell 脚本的新手,我正在尝试学习基础知识。我目前在重定向章节,在这里文档正在被解释。我无法真正理解下面的代码如何与cat
命令结合使用。如果有人可以告诉我吗?
cat << EOF
line1
line2
line3
EOF
Run Code Online (Sandbox Code Playgroud)
我非常了解<< EOF
工作原理。关键字表示输入的结束。我的问题是;cat
将文件名作为输入流;以便它可以在输出流上打印其内容。以上如何在内部工作?我们没有在任何地方指定文件名。shell 是否在内部创建了一些临时文件并将其提供给cat
?我希望我的问题很清楚。
如果cat
在命令行上没有给出文件名(或者如果文件名只是-
),则它切换到从其标准输入读取。
这意味着与
cat <<END
something something
END
Run Code Online (Sandbox Code Playgroud)
cat
会注意到它没有给出文件名,并将继续从到达其标准输入流的 here-document 中读取。
您可以cat
从其标准输入和文件中读取
cat - filename <<END
something something
END
Run Code Online (Sandbox Code Playgroud)
这将导致 here-document 的内容与filename
. 如果参数的顺序是,filename -
那么这也将是数据连接的顺序。
请注意,这-
在任何方面都不是 shell 所特有的,而是被cat
实用程序(以及其他一些)专门解释为“标准输入” 。如果您有一个-
需要运行的实际文件,请cat
使用cat ./-
,即指定带有路径的文件名。
出于所有目的,您可以将 here-document 直接提供给实用程序作为创建临时文件的简写,然后调用附加到标准输入流的实用程序:
printf 'some contents' >tmpfile
utility <tmpfile
rm -f tmpfile
Run Code Online (Sandbox Code Playgroud)
Here-documents 实际上可能不会以这种方式实现(它可能是一个 FIFO(命名管道)),但这并不是一种完全错误的思考方式。
阅读bash
源代码,似乎该特定 shell 通过使用mkstemp()
库函数创建临时文件(如果可用)来实现 here-documents ,否则它会尝试创建一个随机文件名来写入。然后将文档的内容写入该文件,并在读取它的任何内容的标准输入上提供数据,就像它来自文件一样,使用<
. 见redir.c
和lib/sh/tmpfile.c
在bash
源分布。