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

如何让Bash命名管道同时传递命令行参数与用户输入至其他程序

问题分析与解决

核心问题

  1. 语法错误:read.sh最后一行的echo语句未闭合双引号,导致脚本执行到此处时卡住或报错,无法完成完整输出流程。
  2. 命名管道读写逻辑问题:每次用> 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 16:22:45