2017-10-10 125 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獲得好吧執行。我試圖在日誌路徑中使用backtics,但沒有任何好處。我懷疑與fs_lock_file相同的問題,但我還沒有先修復日誌記錄。
有人能睜開我的眼睛,告訴我我錯過了什麼嗎?我不能使腳本記錄到指定的路徑。

回答

2

您分配變量log一個內殼層( [...] )。該變量不被綁定在該子外部之外。

在這種情況下,最好在子外部設置log,即在子外殼塊之前移動變量賦值。

一般在類似的情況,你可以嘗試用大括號(組命令語法{ [...] }更換子shell括號。

組命令在當前shell中執行。請注意,與subshel​​l語法相反,列表必須以換行符或分號結尾,請參閱bash(1)聯機幫助頁的列表部分中的複合命令。

而作爲一般最佳實踐,設置變量名稱,尤其是腳本或函數開頭的常量有助於避免此類錯誤。

+0

謝謝你,將它移到子shell的外面解決了未綁定變量的問題,但腳本仍然沒有記錄。它創建空的日誌文件並且不寫入它。我可以使用tee命令嗎?我是否需要將它添加到subshel​​l中的每個命令(其中大約20個) –

+0

也許你的'couple命令'只寫入stderr?嘗試重定向到stdout以及在'|之前使用'2>&1' tee'。 –

+0

就是這樣,stdout什麼都沒產生,進度可以通過stderr來監控,謝謝 –