![这对简单的 Bash 脚本有什么问题吗?](https://linux22.com/image/212114/%E8%BF%99%E5%AF%B9%E7%AE%80%E5%8D%95%E7%9A%84%20Bash%20%E8%84%9A%E6%9C%AC%E6%9C%89%E4%BB%80%E4%B9%88%E9%97%AE%E9%A2%98%E5%90%97%EF%BC%9F.png)
这对非常简单的 Bash 脚本在 AlmaLinux 8.6 上无法按照我预期的方式工作。
第一个脚本充当一个简单的网关,在 Unix 套接字前面执行预处理/后处理。它还调用第二个脚本来进行日志记录。记录命令的失败不应妨碍网关功能的实现。 (请注意,下面显示的脚本是为了突出问题而设计的版本;实际脚本更为复杂。)
第一个脚本的问题是,尽管使用了该... || true
构造,但日志记录命令中的错误不会被忽略,并使整个脚本失败。为什么这样?
该网关服务的使用者期望通过以下方式得到响应标准输出,以及一些错误消息猫似乎以某种方式最终出现在该频道上。看来,在日志记录失败时失败的不是下面的脚本,而是网关的使用者。我目前正在做更多测试,试图找出问题所在。我将用更多细节更新这个问题。
10 月 22 日编辑:问题出在与管道使用者的接口上。请参阅下面的评论。
#!/bin/bash
set -o errexit
set -o nounset
set -o pipefail
sock_file="/path/to/my.sock"
in_cmd="/path/to/my_in.sh"
out_cmd="/path/to/my_out.sh"
log_cmd="/path/to/my_log.sh" # See second script below
exec 3<&0
$log_cmd <&3 >/dev/null || true
exec 3<&-
exec $in_cmd | nc -U -N "$sock_file" | $out_cmd
第二个脚本的问题是它根本不记录任何内容。我原以为它会得到它的标准输入设置为上面父脚本中的 FD 3?
#!/bin/bash
set -o errexit
set -o nounset
set -o pipefail
log_file="/tmp/in.log"
stdbuf -iL cat >>"$log_file"
另外,——这更多的是一个试图解释一条似乎与实际经验相矛盾的警告消息的问题——当我打电话时猫通过标准缓冲区如上所述,我继续标准错误”stdbuf:行缓冲 stdin 没有意义“。但是,如果我输入猫无缓冲,无论使用stdbuf -i0 ...
还是不使用标准缓冲区无论如何,脚本失败并显示“cat: -: 资源暂时不可用“。所以我猜行缓冲标准输入到底是不是毫无意义,还是我错过了什么?