2017-10-10 15 views
3

私のスクリプトをデバッグするときに必死になっているので、シニアの同僚から私に推奨される構造をいくつか使用しました。幹部からbashスクリプトを使用したバインドされていない変数

#!/bin/bash -x 
set -ueo pipefail 
exec &>/tmp/dq.log 
source ${BASH_SOURCE%/*}/env-prd.sh 

times=${2:-1} 
sleep=${3:-1} 

name="all-dq_hourly" 


fs_lock_file="/tmp/mwa/jobs/prd-${name}.lock" 

(flock -n 200 
    log="/var/log/mwa/prd/$(date +%Y-%m-%d)__${name}.log" 
    for i in $(seq 1 $times); do 
     if [[ ! -f /tmp/stop ]]; then 
     couple commands 

     fi 
     sleep $sleep 
    done 

) 200>"$fs_lock_file" | tee -a $log 

rm $fs_lock_file 

、私は、tee -a $log一部を結合していない変数との問題があることがわかりますcouple commandsオールライト実行されます。私はログ経路でバッククエストを使用しようとしましたが、メリットはありません。私はfs_lock_fileと同じ問題を疑うが、私はまだロギングを修正していない。
誰かが私の目を開いて、何が見えないのか教えていただけますか?私は指定されたパスにスクリプトのログを記録できません。

答えて

2

あなたが) [...] サブシェル内の変数log(を割り当てています。その変数は、そのサブシェルの外側に束縛されていません。

この場合、logをサブシェルの外側に設定するのがベストです。つまり、サブセルブロックの前に変数の割り当てを移動してください。一般

似たようなケースでは、あなたは中括弧(groupコマンドの構文{とサブシェルの括弧を交換しようとすることができ[...] }

グループコマンドは、現在のシェルで実行されます。サブシェル構文とは対照的に、リストは改行またはセミコロンで終わらなければならないことに注意してください.bash(1)のマンページのリストセクションの複合コマンドを参照してください。

一般的なベストプラクティスでは、スクリプトや関数の先頭に変数名、特に定数を設定すると、この種のバグを回避できます。

+0

ありがとうございます、サブネット外に移動していただきありがとうございます。ただし、バインドされていない変数の問題を解決しましたが、スクリプトはまだログを記録しません。空のログファイルが作成され、そこに書き込まれません。私がやったやり方でteeコマンドを使うことができますか?サブシェル(約20個)内のすべてのコマンドに追加する必要がありますか? –

+0

あなたの 'カップルコマンド'はstderrだけに書き込みますか?それを 'stdout 'にリダイレクトして、' |>'の前に '2>&1'を使ってみてください。ティー。 –

+0

それは、stdoutは何も生産されていない、進歩はstderrを介して監視することができます、私は助けることができる喜んで –

関連する問題