linux shell的here document用法(cat << EOF)

本文详细介绍了Linux Shell中的HereDocument概念、使用方法及注意事项,通过实例展示了如何在终端和shell文件中应用HereDocument,并探讨了其变形,如与变量结合及与普通输入的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转载自: http://my.oschina.net/u/1032146/blog/146941


什么是Here Document?
Here Document 是在Linux Shell 中的一种特殊的重定向方式,它的基本的形式如下
cmd << delimiter
  Here Document Content
delimiter

其作用是将两个 delimiter 之间的内容(Here Document Content 部分) 传递给cmd 作为输入参数;
比如在终端中输入cat << EOF,系统会提示继续进行输入,输入多行信息再输入EOF,中间输入的信息将会显示在屏幕上;如下:
fish@mangos:~$ cat << EOF
> First Line
> Second Line
> Third Line EOF
> EOF
First Line
Second Line
Third Line EOF
注:'>'这个符号是终端产生的提示输入信息的标识符
 
这里要注意几点:
EOF只是一个标识而已,可以替换成任意的合法字符(约定大于配置);
作为结尾的delimiter一定要顶格写,前面不能有任何字符;
作为结尾的delimiter后面也不能有任何的字符(包括空格!!!);
作为起始的delimiter前后的空格会被省略掉;



Here Document 不仅可以在终端上使用,在shell 文件中也可以使用,例如下面的here.sh 文件
cat << EOF > output.txt
echo "hello"
echo "world"
EOF

使用 sh here.sh 运行这个脚本文件,会得到output.txt 这个新文件,其内容如下:
echo "hello"
echo "world"

Here Document的变形

delimiter 与变量

在Here Document 的内容中,不仅可以包括普通的字符,还可以在里面使用变量;
例如将上面的here.sh 改为
cat << EOF > output.sh
echo "This is output"
echo $1
EOF
使用sh here.sh HereDocument 运行脚本得到output.sh的内容

echo "This is output"
echo HereDocument
在这里 $1 被展开成为了脚本的参数 HereDocument
 
但是有时候不想展开这个变量怎么办呢,可以通过在起始的 delimiter的前后添加 " 来实现,例如将上面的here.sh 改为
cat << "EOF" > output.sh  #注意引号
echo "This is output"
echo $1
EOF

得到的output.sh 的内容为
echo "This is output"
echo $1

<< 变为 <<-

Here Document 还有一个用法就是将 '<<' 变为 '<<-'
使用 <<- 的唯一变化就是Here Document 的内容部分每行前面的tab(制表符)将会被删除掉;
该用法在编写Here Document时可将内容部分进行缩进,方便阅读代码.



<think>首先,用户的问题是关于比较不同 shell 命令中重定向与 tee / cat 命令的组合行为。具体来说,用户想比较以下命令: 1. `tee x << EOF` 2. `tee > x << EOF` 3. `tee << EOF > x` 4. `cat > x << EOF` 5. `cat << EOF > x` 用户提供了几个引用,这些引用讨论了 `cat` 命令与重定向符(如 `<<`, `<<-`, `>`, `>>`)的用法。我需要基于这些引用和我的知识来回答。 关键点从引用中: - 引用[1]:解释了 `cat << EOF` 和 `cat <<- EOF` 的区别。`<< EOF` 表示从标准输入读取直到遇到 `EOF` 作为结束标识符。`<<- EOF` 忽略前导制表符(Tab)字符。 - 引用[2]:进一步说明了 `<<` 和 `<<-` 的区别,并给出了例子。 - 引用[3]:总结了输入输出重定向符,如 `<`, `<<`, `>`, `>>`,以及 `cat` 指令的用法。 用户的问题焦点是 `tee` 和 `cat` 与 `<< EOF` 和 `>` 重定向的组合。 现在,我需要解释每个命令的行为: 1. **`tee x << EOF`**: - `tee x` 表示将标准输入复制到文件 `x` 并输出到标准输出。 - `<< EOF` 表示从标准输入读取,直到遇到 `EOF` 作为结束符。 - 所以,这个命令会从标准输入读取数据(直到 `EOF`),然后将数据写入文件 `x` 并输出到标准输出。 2. **`tee > x << EOF`**: - `tee > x`:这里 `> x` 是重定向 `tee` 的标准输出到文件 `x`。但 `tee` 本身需要文件参数。 - 在 shell 中,`tee` 命令的语法是 `tee [OPTION]... [FILE]...`。所以 `tee > x` 可能不正确,因为 `> x` 是重定向,而不是文件参数。 - 实际上,`tee > x` 可能被解释为 `tee` 没有文件参数,然后将其输出重定向到 `x`。但 `tee` 默认将输出发送到标准输出和文件,如果没有文件参数,它可能只输出到标准输出,然后重定向到 `x`。 - 更准确地说:`tee > x` 相当于运行 `tee` 没有参数,然后将标准输出重定向到 `x`。但 `tee` 没有参数时,它只从标准输入读取并写入标准输出,所以重定向后,它会将输入写入 `x`,但不会写入标准输出(因为重定向了)。 - 结合 `<< EOF`:`tee > x << EOF` 会从 `<< EOF` 读取输入,`tee` 处理输入,但由于 `> x` 重定向了输出,输入会被写入 `x`,而不会输出到终端。 - 标准行为:在 shell 中,命令的顺序很重要。`tee > x << EOF` 应该被解析为:`tee` 命令,其标准输出重定向到 `x`,然后输入来自 `<< EOF`。 3. **`tee << EOF > x`**: - 类似,但顺序不同:`tee << EOF > x`。 - 输入重定向 `<< EOF` 和输出重定向 `> x` 都应用于 `tee`。 - 所以,`tee` 从 `<< EOF` 读取输入,然后将其输出重定向到 `x`。 4. **`cat > x << EOF`**: - `cat` 命令读取输入并输出。 - `> x` 重定向 `cat` 的标准输出到文件 `x`。 - `<< EOF` 提供输入。 - 所以,`cat` 从 `<< EOF` 读取输入,并将输出写入 `x`。 5. **`cat << EOF > x`**: - 顺序不同:`cat << EOF > x`。 - 输入来自 `<< EOF`,输出重定向到 `x`。 - 行为应该与 `cat > x << EOF` 相同,因为重定向的顺序在 shell 中通常不影响最终行为,除非有依赖关系。 在 shell 中,输入和输出重定向的顺序通常不重要,因为 shell 会设置好文件描述符再执行命令。所以,对于 `cat` 和 `tee`,这些组合可能行为相同,但需要验证。 关键区别: - `tee` 默认将输出发送到标准输出和文件,而 `cat` 只发送到标准输出。 - 在 `tee x` 中,`x` 是文件参数,所以 `tee` 写入该文件。 - 在 `tee > x` 中,`> x` 重定向标准输出,所以 `tee` 没有文件参数,只写入标准输出(然后重定向到 `x`)。 - 类似地,对于 `cat`,`cat > x` 重定向输出到 `x`。 现在,关于 `<< EOF`: - `<< EOF` 表示 here-document,它提供标准输入。 - 对于 `tee` 和 `cat`,输入来自 here-document。 比较行为: -
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值