Bash中PIPESTATUS数组无法读取全部管道退出码的问题解决
关于Bash中PIPESTATUS数组访问的问题
问题场景
执行如下Bash脚本时:
#!/bin/bash echo "hello" | wc -w echo "${PIPESTATUS[0]}" echo "${PIPESTATUS[1]}"
发现echo "${PIPESTATUS[0]}"能输出0,但echo "${PIPESTATUS[1]}"无输出;但如果在管道执行后立即用echo ${PIPESTATUS[*]},却能得到0 0。
原因分析
- PIPESTATUS的易失性:Bash的
PIPESTATUS数组是一次性、易失性的——它仅保存上一条管道命令的退出状态,一旦执行任何其他命令(哪怕是简单的echo),PIPESTATUS数组就会被覆盖重置。在你的脚本中,第一条echo "${PIPESTATUS[0]}"执行后,PIPESTATUS已经被更新为这条echo命令的退出状态(仅包含一个元素0),因此第二条echo访问PIPESTATUS[1]自然没有内容。
解决办法
要保留管道的所有退出状态,需在管道执行后立即将PIPESTATUS数组的值复制到普通数组,之后通过普通数组访问元素:
#!/bin/bash echo "hello" | wc -w # 立即复制PIPESTATUS到自定义数组 pipe_status=("${PIPESTATUS[@]}") # 访问自定义数组的元素 echo "${pipe_status[0]}" echo "${pipe_status[1]}"
执行上述脚本后,就能正确输出两个0。
内容的提问来源于stack exchange,提问作者masrur
相关产品推荐
相关产品推荐

