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
这段代码的巧妙之处:
find用-print0输出文件名,用null字符分隔,完美解决了文件名带空格、特殊字符(比如&、*)的问题。< <(find ...)把find的输出转为临时可读文件,让mapfile能直接读取。mapfile -td '' archives会把所有null分隔的文件名存入archives数组,确保每个文件名都是完整的,不会被错误拆分。- 循环会一直执行,直到找不到任何压缩包(
archives数组长度为0)才退出。
内容的提问来源于stack exchange,提问作者snkb0b101
相关产品推荐
相关产品推荐

