在 bash 中复制时遇到一些问题。这很好用:
# Enable extended globbing and include filenames beginning with a '.'
shopt -s extglob dotglob
# Copy git repo to expected place
cp -r !($YOCTO_DIR) $POKY_DIR/$GIT_REPO_NAME/
但是当我if
围绕它发表声明时:
if [ -z "$FROM_JENKINS" ]; then
# FROM_JENKINS is blank, this is a local build
# Enable extended globbing and include filenames beginning with a '.'
shopt -s extglob dotglob
# Copy git repo to expected place
cp -r !($YOCTO_DIR) $POKY_DIR/$GIT_REPO_NAME/
fi
我得到:
./build.sh:第 80 行:意外标记 `(' 附近的语法错误
第 80 行是cp
. 如果我删除它工作的括号:
cp -r . $POKY_DIR/$GIT_REPO_NAME/
为什么if
语句不喜欢中的括号cp
?
问题是读取和执行的顺序和“范围”。
整个
if
块只是一个命令。因此 shell 在执行命令之前必须一直读取到该命令的末尾。这意味着WITHOUT 规则在块
shopt -s extglob dotglob
结束之前有效if
,因为shopt
仅在之后执行。没有shopt
the!(
在那里是非法的。因此,您必须将 the 移到
shopt
the 之前if
(并可能在else
分支中将其还原)。