확장된 와일드카드 옵션이 포함된 'cp' 문을 'if' 블록으로 이동하면 구문 오류가 발생합니다.

확장된 와일드카드 옵션이 포함된 'cp' 문을 'if' 블록으로 이동하면 구문 오류가 발생합니다.

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분기에서 되돌릴 수도 있음).

관련 정보