You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 12:15:34