Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带bash脚本的未绑定变量_Bash_Shell_Scripting - Fatal编程技术网

带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监控进度,谢谢