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