我在处理 shell 脚本时遇到了一些问题。脚本中的一个命令用于将一组命令从 Jenkins 主机推送到 MySQL 数据库主机,以“本地”运行到 MySQL 数据库的备份。
当导出变量供以后使用时就会出现问题。匿名示例:
ssh -q -o Batchmode=yes mysql@${host} \
"export variable=$(ls -td ${backup_path}/FULL/*/ | head -1); \
echo $variable"
其目标ls -td
是拉取子目录中最新写入的目录${backup_path}/FULL
。
执行这个特定命令时出现的错误是
ls: cannot access ${backup_path}/FULL/*/: No such file or directory
的 echo$incr_basedir
也返回空输出。
我已经尝试过检查 ${backup_path}/FULL 中是否存在子目录并验证权限,这是输出:
-bash-4.2$ pwd
${backup_path}/FULL
-bash-4.2$ ls -l
total 498
drwxr-x---. 28 mysql mysql 2019 May 3 16:53 2017-05-03_16-47-37
我应该如何继续实现我的目标?
答案1
正如埃里克之前提到的,这些问题是由于范围界定造成的。
我有许多本地变量通过未列出的复合 ssh 指令发送和推送,这需要使用双引号。由于我希望 ls -td 远程执行,因此我专门创建了一个全新的 ssh 命令来设置此变量。设置变量后,我像其他变量一样输入它。
export variable="$(ssh -q -o Batchmode=yes mysql@$host 'ls -td ${backup_dir}/FULL/*/ | head -1')"
该错误不再存在。事实上,我的问题是本地主机与远程主机没有相同目录结构的范围。