2017-10-10 74 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来监控,谢谢 –