将Here Document绑定到文件描述符3并复制给cat标准输入失败,求解决
问题分析与解决方法
咱们先拆解下你脚本里的问题,然后一步步修正:
原脚本的核心错误
cat 3<<222889写法逻辑错位:
这里的3<<222889确实把Here Document绑定到了文件描述符3,但cat命令后面的3会被当成普通文件名处理——cat会尝试打开名为"3"的文件,而非读取文件描述符3的内容,这完全偏离了你的需求。- 单独的
0<&3无效:
这行是独立的命令,而Here Document结束后,关联的文件描述符3会被系统自动关闭,此时再执行0<&3根本找不到可用的fd3,自然没效果。
正确的实现方式
这里提供两种实用写法,你可以按需选择:
方式一:让cat直接读取文件描述符3
先把Here Document绑定到fd3,再通过<&3让cat读取这个描述符的内容:
#!/bin/bash 3<<222889 I am reading a string into file descriptor 3 which is copied to standard input 222889 cat <&3
方式二:将fd3复制到cat的标准输入
在执行cat时,把fd3重定向到stdin(文件描述符0),这样cat默认读取stdin就能拿到内容:
#!/bin/bash 3<<222889 I am reading a string into file descriptor 3 which is copied to standard input 222889 0<&3 cat
更紧凑的合并写法
可以把重定向和cat命令写在同一行,逻辑更简洁:
#!/bin/bash cat 0<&3 3<<222889 I am reading a string into file descriptor 3 which is copied to standard input 222889
原理补充
当你用n<<delimiter时,系统会创建临时文件/管道,将文件描述符n绑定到它,直到遇到结束符delimiter。如果要让命令读取这个fd的内容,要么用<&n把fd n复制到stdin,要么让命令直接读取fd n(cat默认读stdin,所以需要重定向操作)。
内容的提问来源于stack exchange,提问作者Pushparaj
相关产品推荐
相关产品推荐

