![확장된 와일드카드 옵션이 포함된 'cp' 문을 'if' 블록으로 이동하면 구문 오류가 발생합니다.](https://linux55.com/image/221317/%ED%99%95%EC%9E%A5%EB%90%9C%20%EC%99%80%EC%9D%BC%EB%93%9C%EC%B9%B4%EB%93%9C%20%EC%98%B5%EC%85%98%EC%9D%B4%20%ED%8F%AC%ED%95%A8%EB%90%9C%20'cp'%20%EB%AC%B8%EC%9D%84%20'if'%20%EB%B8%94%EB%A1%9D%EC%9C%BC%EB%A1%9C%20%EC%9D%B4%EB%8F%99%ED%95%98%EB%A9%B4%20%EA%B5%AC%EB%AC%B8%20%EC%98%A4%EB%A5%98%EA%B0%80%20%EB%B0%9C%EC%83%9D%ED%95%A9%EB%8B%88%EB%8B%A4..png)
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
블록은 단지 명령일 뿐입니다. 따라서 쉘은 명령을 실행하기 전에 명령을 읽어야 합니다.
이것은 규칙을 의미한다아니요 shopt -s extglob dotglob
(여기서 모든 내용이 아닌 줄을 언급하고 있습니다. ilkkachu가 주석에서 지적했듯이: dotglob
질문과 관련이 없습니다.) if
블록이 끝날 때까지만 유효합니다. 왜냐하면 블록 shopt
이 끝난 후에만 실행되기 때문입니다. 그렇지 않다면 불법 shopt -s extglob
입니다 !(
.
shopt
따라서 이전 으로 이동해야 합니다 if
(및 else
분기에서 되돌릴 수도 있음).