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

Bash中‘< <’(带空格)语法的功能及箭头方向的影响是什么?

Bash中< <语法的作用详解

嘿,这个问题问得很到位!你提到的< <是Bash里的**进程替换(Process Substitution)**语法,我给你拆解明白:

一、< <(command)的核心作用

  • 这是进程替换的「读方向」写法:括号里的command会在子进程中执行,它的输出会被系统包装成一个临时的可读文件描述符,然后通过前面的<重定向,把这个临时文件的内容作为输入传给左边的命令。
  • 对比管道|,它的优势在于:管道会创建子进程,可能导致父进程的变量无法被修改;而进程替换的< <写法,左边的命令是在当前shell进程中执行的,能直接使用当前上下文的变量,像你示例里的mapfile就能直接把结果存在当前shell的archives数组里。

二、箭头方向对功能的影响

进程替换有两种方向,作用完全不同:

  • < <(command):读模式——把command的输出当作输入源,传给左边命令的标准输入。
  • > >(command):写模式——把左边命令的输出当作临时可写文件,传给右边command的标准输入(相当于让右边命令从这个临时文件读取内容)。
  • 重点提醒:箭头之间必须有空格!如果写成<<,那就是**Here Document( heredoc)**语法了,用来输入多行文本,和进程替换完全是两回事。

三、结合你的示例代码分析

先把你的代码格式化清晰:

while :; do
    mapfile -td '' archives < <(find . -type f -name '*.zip' -o -name '*.7z' -print0)
    [[ ${#archives[@]} -eq 0 ]] && break
    # 这里应该还有处理archives数组的逻辑,比如批量解压等
done

这段代码的巧妙之处:

  1. find用-print0输出文件名,用null字符分隔,完美解决了文件名带空格、特殊字符(比如&、*)的问题。
  2. < <(find ...)把find的输出转为临时可读文件,让mapfile能直接读取。
  3. mapfile -td '' archives会把所有null分隔的文件名存入archives数组,确保每个文件名都是完整的,不会被错误拆分。
  4. 循环会一直执行,直到找不到任何压缩包(archives数组长度为0)才退出。

内容的提问来源于stack exchange,提问作者snkb0b101

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.01 03:02:42