我想模擬管道故障,所以我想我需要一個陷阱來殺死它後一秒左右?如何模擬管道失敗?
#!/bin/bash
set -u
set -o pipefail
cat /dev/zero | cat | cat
但是這樣的陷阱是如何實現的?
我想模擬管道故障,所以我想我需要一個陷阱來殺死它後一秒左右?如何模擬管道失敗?
#!/bin/bash
set -u
set -o pipefail
cat /dev/zero | cat | cat
但是這樣的陷阱是如何實現的?
你可以這樣做:
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
正在工作,因爲它應該返回管道中任何命令的最後一個非零退出代碼。
要模擬pipefail,管道中的一個進程應該以非零值(正如你所知道的那樣意味着某種失敗)退出。 More about pipelines。 是的,向進程發送SIGKILL或SIGINT信號將導致退出代碼高於零,at least on Linux it does so。
但是這樣的陷阱是如何實現的?
看來,你在想什麼都要SIGSPEC爲trap
。
如果
pipefail
啓用,管道的返回狀態是 最後一個(最右邊)的命令與非零狀態退出值,或零 如果全部命令成功退出。
你想陷阱ERR
。
例子:
set -u
set -o pipefail
trap 'echo pipefail' ERR
false | true
這不是很清楚你的要求。你能詳細說明一下嗎? – devnull