我在调试脚本时变得绝望,我使用了一些从我的高级同事那里推荐给我的构造,我不知道如何让它正常工作。
#!/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存在同样的问题,但我还没有先修复日志。
有人可以睁开眼睛告诉我我失踪了吗?我无法使脚本记录到指定的路径。
答案 0 :(得分:4)
您要在子shell log
[...] (
中分配变量)
。该变量不在子shell之外。
在这种情况下,最好只在子shell外设置log
,即在子shell块之前移动变量赋值。
通常在类似的情况下,您可以尝试用大括号替换子shell括号(组命令语法){
[...] }
。
组命令在当前shell中执行。请注意,与子shell语法相反,列表必须以换行符或分号结束,请参阅bash(1)联机帮助页的“列表”部分中的“复合命令”。
作为一般最佳实践,设置变量名称,尤其是脚本或函数开头的常量有助于避免此类错误。