これは単純なBashスクリプトに問題がありますか?

これは単純なBashスクリプトに問題がありますか?

この非常に単純なBashスクリプトのペアは、AlmaLinux 8.6で期待どおりに機能しません。

最初のスクリプトは、Unixソケットの前で事前/後処理を実行する単純なゲートウェイとして機能します。また、ロギング用の2番目のスクリプトを呼び出します。コマンドの記録に失敗したため、ゲートウェイ機能の実装を中断しないでください。 (下記のスクリプトは問題を強調するように設計されたバージョンであり、実際のスクリプトはより複雑です。)

最初のスクリプトの問題は、その... || 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

2番目のスクリプトの問題は、何も記録しないことです。それで得ると思いました。標準入力上記の親スクリプトで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: -: リソースを一時的に使用できません。「。だからラインバッファリングだと思います。標準入力無意味ですか、それとも何か抜けましたか?

ベストアンサー1

おすすめ記事