nohup でスクリプトを実行中にエラーが発生しました

nohup でスクリプトを実行中にエラーが発生しました

nohup sh を使用してスクリプトを実行中に、次のエラーが発生しました:

 syntax error near unexpected token `('

私のスクリプトは次のとおりです:

#!/bin/bash
report_log="report.log";
grep -A 3 'successful\|ERROR COUNT EXCEEDED' *.log  > ${report_log};
echo ${report_log};
MAX_ERR_COUNT_EXCEED_MSG="No Max Count Error.";
if grep "ERROR COUNT EXCEEDED" ${report_log}; then
   MAX_ERR_COUNT_EXCEED_MSG="MAX ERROR COUNT EXCEEDED, CHECK RECORD COUNT!";
fi
RESULT_MSG="Execution successful";
if grep '\([1-9]\d*\b\)' ${report_log} | grep 'data errors'; then
   RESULT_MSG="Execution with ERROR";
fi
cat ${report_log} <(echo "-----------") <(echo "${MAX_ERR_COUNT_EXCEED_MSG}") <(echo "${RESULT_MSG}") | mailx -s "Test Result" [email protected]

これは、いくつかのログ ファイルをフィルターし、それらのファイルから実行ステータスに関するレポート メールを生成するスクリプトです。

エラーは<(スクリプト内での使用から発生しているようですが、bash シェバンを追加したので動作するはずだと思いました。以下のコマンドを使用して実行すると、スクリプトは問題なく実行されます。

. ./script.sh

どのようなご助力やアドバイスでも大歓迎です。ありがとうございます。

答え1

問題は、スクリプトを as で実行すると、nohup sh /path/to/your/script.shシェバン行インタープリターがオーバーライドされることです。 as で呼び出されると、sh特定bashの機能がオフになり (これはおそらく他のシェルでも同様です)、プロセス置換を解析できなくなります。

解決策は、 が制限なしで実行されていることを確認することです。これは、環境変数をチェックし、の代わりにbashでスクリプトを再度呼び出すことで実行できます。bashsh

#! /bin/bash

if [ "YES" = "$RUNNING_AS_BASH" ]; then
        eval 'cat <(echo "-----------")'
else
        test -f "$0" || exit 1
        RUNNING_AS_BASH="YES" exec bash "$0"
fi

残念ながらbash、 as は構造sh全体を解析しますif。したがって、エラーを回避するには、互換性のない構文を eval ステートメントで隠す必要があります。

evalアクションを構造から取り出すとif、スクリプトの残りの部分は解析されないため、これを回避できます。

#! /bin/bash

if [ "YES" != "$RUNNING_AS_BASH" ]; then
        test -f "$0" || exit 1
        RUNNING_AS_BASH="YES" exec bash "$0"
fi

cat <(echo "-----------")

関連情報