2013-10-01 48 views
1

我想模擬管道故障,所以我想我需要一個陷阱來殺死它後一秒左右?如何模擬管道失敗?

#!/bin/bash 

set -u 
set -o pipefail 

cat /dev/zero | cat | cat 

但是這樣的陷阱是如何實現的?

+0

這不是很清楚你的要求。你能詳細說明一下嗎? – devnull

回答

3

你可以這樣做:

echo "a" | grep "b" | sed 's/a/c/g' 
echo $? 

set -o pipefail 
echo "a" | grep "b" | sed 's/a/c/g' 
echo $? 

它打印:

0 
1 

的回報之間1退出代碼(失敗)的grep,所以pipefail設置後,整體退出代碼1。所以pipefail正在工作,因爲它應該返回管道中任何命令的最後一個非零退出代碼。

1

但是這樣的陷阱是如何實現的?

看來,你在想什麼都要SIGSPECtrap

如果pipefail啓用,管道的返回狀態是 最後一個(最右邊)的命令與非零狀態退出值,或零 如果全部命令成功退出。

你想陷阱ERR

例子:

set -u 
set -o pipefail 

trap 'echo pipefail' ERR 

false | true