带bash脚本的未绑定变量
当调试我的脚本时,我变得绝望了,我使用了我的大四同学推荐给我的一些结构,我不知道如何使它正常工作带bash脚本的未绑定变量,bash,shell,scripting,Bash,Shell,Scripting,当调试我的脚本时,我变得绝望了,我使用了我的大四同学推荐给我的一些结构,我不知道如何使它正常工作 #!/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" ( flo
#!/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
从execs中,我可以看到tee-a$log
部分的unbound变量存在问题,couple命令
正确执行。我尝试在日志路径中使用backtics,但没有任何好处。我怀疑fs_lock_文件也存在同样的问题,但我还没有首先修复日志记录。有人能睁开我的眼睛告诉我我错过了什么吗?我无法将脚本记录到指定的路径。您正在子shell中分配变量
log
([…])
)。该变量未绑定到该子shell之外
在这种情况下,最好将log
设置在子shell之外,即将变量赋值移到子shell块之前
通常在类似的情况下,您可以尝试用大括号(组命令语法){
[…]}
替换子shell括号
组命令在当前shell中执行。请注意,与子shell语法不同,列表必须以换行符或分号结尾,请参见bash(1)手册页列表部分中的复合命令
作为一种通用最佳实践,设置变量名,特别是脚本或函数开头的常量有助于避免此类错误。谢谢,将其移出子shell解决了未绑定变量的问题,但脚本仍然不记录。它创建了一个空的日志文件,并没有写入其中。我可以像以前那样使用tee命令吗?或者我需要将它添加到子shell中的每个命令中(大约20个)或者您的
耦合命令只写入stderr?尝试在|tee
之前使用2>&1
将其重定向到stdout。也就是说,stdout没有产生任何结果,可以通过stderr监控进度,谢谢