在 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: line 80: syntax error near unexpected token `('
80 号线是cp
.如果我删除括号它会起作用:
cp -r . $POKY_DIR/$GIT_REPO_NAME/
为什么该if
语句不喜欢括号中的cp
?
答案1
问题在于读取和执行的顺序和“范围”。
整个if
块只是一个命令。因此 shell 必须先读取该命令,然后才能执行该命令。
这意味着规则没有 shopt -s extglob dotglob
(我指的是这里的行,而不是其所有内容;正如 ilkkachu 在评论中指出的那样: thedotglob
与问题无关)在if
块结束之前都有效,因为shopt
仅在之后执行。如果没有的话,shopt -s extglob
那!(
是非法的。
因此,您必须将 移至shopt
之前if
(并且可能会在else
分支中将其恢复)。