Shell重定向运算符疑问:多输入重定向为何仅最后文件生效?
问题解答
首先明确两个核心结论:
inputn.txt是被送入cat的**标准输入(stdin)**读取的,并非当作命令参数。因为你的命令里cat后面没有直接跟文件名参数,所有文件都是通过<输入重定向指定的,而无参数的cat默认会从stdin读取内容。- 前面的
input1.txt等文件内容不在stdin流里,是因为shell处理输入重定向的逻辑和你理解的输出重定向完全不同:
输入重定向<的工作逻辑
shell在执行cat命令之前,会依次处理每个输入重定向操作:
- 先处理
< input1.txt:打开input1.txt,将其绑定到cat的stdin(文件描述符0) - 接着处理
< input2.txt:关闭之前绑定的input1.txt文件描述符,重新打开input2.txt并绑定到stdin - 以此类推,直到最后一个
< inputn.txt:此时cat的stdin已经被替换为inputn.txt的文件描述符
当cat正式启动运行时,它只能从当前绑定的stdin(也就是最后一个inputn.txt)读取内容,前面的文件已经被shell关闭,自然无法读取到它们的内容。
关于输出重定向的误区纠正
顺便澄清一个误解:你提到的cat <<< "Hello World" > output1.txt > output2.txt ... > outputn.txt其实不会同时将内容发送到所有输出文件。多个>输出重定向的逻辑和输入重定向类似——每一个>都会让shell关闭当前的stdout,重新打开新文件并绑定为stdout。所以最终只有最后一个outputn.txt会写入内容,前面的文件会被创建(截断为空)但没有内容。如果要实现同时输出到多个文件,需要用tee命令:
cat <<< "Hello World" | tee output1.txt output2.txt ... outputn.txt
内容的提问来源于stack exchange,提问作者gaband
相关产品推荐
相关产品推荐

