读取管道后的bash返回码
Posted
技术标签:
【中文标题】读取管道后的bash返回码【英文标题】:bash return code after reading for pipe 【发布时间】:2014-11-28 10:09:33 【问题描述】:如何返回 $code 作为此脚本的退出代码,而不是最后一个命令 rm "$fifo" 的退出代码。
#!/bin/bash
fifo=myPipe
mkfifo "$fifo"|| exit 1
read code <$fifo
|
timeout 1 sleep 2
timeoutCode=$?
echo "$timeoutCode" >$fifo
rm "$fifo"
【问题讨论】:
是的,在第一组我会tail -f一个文件,在第二组我会grep匹配或超时,然后通过管道通知第一组,这将杀死尾巴,最后我想要一个退出代码显示我是否超时匹配 【参考方案1】:也许这可以达到您的目的:
这个答案有 2 个部分,您正在寻找:
-
设置 $?到任何所需的值
使用
$PIPESTATUS[@]
数组获取流水线各个阶段的退出状态...
代码:
#!/bin/bash
return_code() return $1; # A dummy function to set $? to any value
fifo=myPipe
mkfifo "$fifo"|| exit 1
read code <$fifo
return_code $code
|
timeout 1 sleep 2
timeoutCode=$?
echo "$timeoutCode" >$fifo
ret=$PIPESTATUS[0]
rm "$fifo"
exit $ret
考虑到整个脚本的预期退出代码实际上是通过管道的第 2 阶段生成的,下面的逻辑也可以工作。
#!/bin/bash
fifo=myPipe
trap "rm $fifo" EXIT #Put your cleanup here...
mkfifo "$fifo"|| exit 1
read code <$fifo
|
timeout 1 sleep 2
timeoutCode=$?
echo unused > $fifo
exit $timeoutCode
【讨论】:
可以了,所以stage 0的退出码就是最后一个函数“return_code”的返回码? 是的,$PIPESTATUS[0]
将包含第一阶段的退出状态,这里恰好是$code
...以上是关于读取管道后的bash返回码的主要内容,如果未能解决你的问题,请参考以下文章