Shell脚本<&符号含义及`2<<< hello <&2 cat`语句详解
Shell中
<&符号的含义 <&是Shell原生的文件描述符复制操作符,专门用于输入流的重定向绑定,语法格式为[n]<&m:
- 如果不写前面的数字
n,默认操作的是0号文件描述符,也就是进程的标准输入(STDIN) - 整个操作的效果是:将n号文件描述符,指向当前m号文件描述符所绑定的可读流,相当于把m的读权限句柄复制一份给n
- 注意不要和输出侧的
>&操作符混淆,<&只处理输入流的绑定关系。
2<<< hello <&2 cat语句逐段拆解与运行逻辑 Shell执行带重定向的命令时,会严格从左到右依次处理所有重定向规则,全部处理完成后才启动后续的命令,按顺序拆解每一段的作用如下:
2<<< hello
这里的<<<是here-string(here字符串)语法,属于输入重定向的一种,作用是把后面跟随的字符串(自动补末尾换行)封装成一个可读的内存流,绑定到前面指定的文件描述符上。平时我们写cat <<< test时没有写描述符编号,默认绑定到0号标准输入,所以cat能直接读到test。
这一段的实际效果是:创建一个内容为hello\n的内存可读流,把2号文件描述符(也就是平时默认绑定终端错误输出的STDERR)绑定到这个流上——这一步已经把FD2从默认的“写终端”改成了“指向可读的hello流”。<&2
就是前面说的输入描述符复制操作,没有指定前置编号,默认操作0号标准输入:把FD0绑定到当前FD2指向的流,也就是上一步创建的存了hello的内存流。这一步处理完之后,进程的标准输入已经完全指向hello的内容了。cat
最终执行的命令,cat的默认逻辑就是从0号标准输入读取所有内容,写入1号标准输出(默认绑定终端)。
输出hello的核心原理
整个流程走完启动cat的时候,cat的标准输入已经指向存了hello的流,读取后直接输出到终端,自然就打印出hello。
很多人卡壳的点是误以为FD2只能当错误输出用,实际上根本不是:文件描述符本身只是内核维护的打开文件句柄的数字索引,没有“必须做输入/必须做输出”的天生属性,Shell启动时默认给FD0绑终端输入、FD1/FD2绑终端输出只是初始配置,重定向可以任意修改这些编号的指向,没有强制限制。
内容的提问来源于stack exchange,提问作者Hardguy
相关产品推荐
相关产品推荐

