我在这里不知所措,试图找出为什么基本上将几个文件和目录从一个地方复制到另一个地方的 shell 脚本会导致其中两个文件(并且只有这两个)的内容被清除的原因并替换为link ../../modules/[name_of_file]
.
APPFOLDER="/home/opt/ke"
CMD_APPCOPY="cp -fr _opt/ke/* $APPFOLDER"
[...]
echo "copying app-files to app-folder $APPFOLDER ..."
eval $CMD_APPCOPY
if [ $? -ne 0 ] ; then
echo "could not copy app-files to app-folder $APPFOLDER"
exit
fi
如果我手动开始文件复制,一切都很好。
cp -fr _opt/ke/* /home/opt/ke
link ../../modules/[name_of_file]
但是,如果我运行该脚本,除了添加在空文件顶部的部分之外,这两个文件将为空。
这两个文件的大小既不是很大也不是很小,它们与该目录中其他文件的唯一区别是它们是 Perl-Module .pm 类型。它们的实际源目的地是 ,/home/xxx/xxx/deploy/KEB/_opt/ke/modules/
而完整目标目的地是/home/opt/ke/modules/
。脚本和手动副本/home/xxx/xxx/deploy/KEB/
当然是运行的。
非常感谢任何如何解释这种行为或我应该寻找什么来修复脚本的想法/建议。
答案1
我认为你的问题是使用eval
.如果您在运行脚本之前使用数组来存储命令,那么这应该足以执行这些命令。
#!/bin/bash
CMD1=(echo "onecmd")
CMD2=(printf "%s\n" ascrip*)
CMD3='echo cmd3'
${CMD1[@]}
${CMD2[@]}
$CMD3
无需让他们经历eval
。
例子
$ ./ascript.bash
onecmd
ascript.bash
cmd3
调试
如果启用 Bash 的调试模式,您可以看到幕后发生的情况。
$ bash -x ./ascript.bash
+ CMD1=(echo "onecmd")
+ CMD2=(printf "%s\n" ascrip*)
+ CMD3='echo cmd3'
+ echo onecmd
onecmd
+ printf '%s\n' ascript.bash
ascript.bash
+ echo cmd3
cmd3