如何让Bash命名管道同时传递命令行参数与用户输入至其他程序
问题分析与解决
核心问题
- 语法错误:
read.sh最后一行的echo语句未闭合双引号,导致脚本执行到此处时卡住或报错,无法完成完整输出流程。 - 命名管道读写逻辑问题:每次用
> testPipe或< testPipe都会临时打开/关闭管道,写入端关闭后,读取端的read会触发EOF,导致读取顺序混乱。当前写法中,write.sh写入用户名后关闭管道,read.sh读取用户名后,第二个read会等待新写入;当write.sh写入用户输入后再次关闭管道,read.sh读取到输入后,因语法错误无法完成后续输出。
修复后的代码
read.sh
#!/bin/bash # 打开命名管道为文件描述符3,保持持续读取状态 exec 3< testPipe while true; do # 从文件描述符3读取两行数据 read -u3 user read -u3 request # 修复引号闭合问题,正常输出内容 echo "received from the pipe: $user" echo "user request: $request" done # 关闭文件描述符(循环不会自然结束,可忽略) exec 3<&-
write.sh
#!/bin/bash user=$1 # 打开命名管道为文件描述符4,保持持续写入状态 exec 4> testPipe while true; do # 向文件描述符4写入两行数据 echo "$user" >&4 read -p "Enter a request here: " request echo "$request" >&4 done # 关闭文件描述符(循环不会自然结束,可忽略) exec 4>&-
额外说明
- 使用文件描述符(如3、4)持续打开管道,避免每次读写触发管道的打开/关闭操作,确保读写逻辑同步。
- 修复了
read.sh中的引号语法错误,保证输出语句正常执行。 - 运行方式不变:先启动
read.sh,再在另一个终端运行write.sh "john",即可看到read.sh终端同时输出用户名和用户输入的请求内容。
内容的提问来源于stack exchange,提问作者Jake O Grady
相关产品推荐
相关产品推荐

