shell脚本如何避免由于使用关闭的文件描述符而导致的SIGPIPE?

shell脚本如何避免由于使用关闭的文件描述符而导致的SIGPIPE?

如果另一端消失,shell 脚本可能会丢失其标准和其他文件描述符。发生这种情况的一种方法是终止ssh用于启动脚本的客户端:

$ ssh localhost test
^C

这将启动一个通过 SSHbash调用的脚本,并使用 a 来终止该命令。这不会终止继续运行,但会关闭附加的文件描述符(例如标准输入/输出/错误)。testCtrlCsshtest

如果test尝试使用那些关闭的文件描述符,那么它将以SIGPIPE.一个简单的echo就足够了。

其中test可能有一个log函数,用于echo将消息写入 systemd 日志以及标准错误。像这样的东西:

log() {
 echo "$*" | systemd-cat -t test
 echo >&2 "$*"
}

第二个在会话终止后echo引发 a ( )。通过将 放入子 shell 中,可以防止这种情况发生,以便继续执行而不会出现问题:SIGPIPEsshCtrlCechoecho

( echo >&2 "$*" )

但还有更好的办法吗?

答案1

如果您想忽略脚本中的 SIGPIPE,则可以:

trap "" PIPE

相关内容