bash
  • cygwin
  • 2013-08-20 7 views 0 likes 
    0

    Cygwin64를 통해 쉘 스크립트를 실행할 때 오류가 발생합니다 (아래 출력). 스크립트의 관련 부분은 다음과 같습니다. 흥미로운 점은 에코 된 명령을 복사하여 붙여 넣으면 불만없이 실행된다는 것입니다. 그래서, 내가 제대로하지 못한 것은 무엇입니까?bash 쉘 스크립트 오류가 스크립트가 아닌 명령 행에서 작동합니다.

    ASCIIDOC_OPTS="--asciidoc-opts='-a lang=en -v -b docbook -d book'" 
    DBLATEX_OPTS="--dblatex-opts='-V -T db2latex'" 
    echo "Generating dblatex PDF output via a2x" 
    cmd="a2x -v -f pdf -L ${ASCIIDOC_OPTS} ${DBLATEX_OPTS} $1.asciidoc" 
    echo $cmd 
    $cmd 
    echo "done." 
    

    스크립트가 UTF-8 * nix에서 스크립트 파일 엔딩으로 저장되었습니다 여기

    [[email protected] resources]$ makebook MyBook 
    Generating dblatex PDF output via a2x 
    a2x -v -f pdf -L --asciidoc-opts='-a lang=en -v -b docbook -d book' --dblatex-opts='-V -T db2latex' MyBook.asciidoc 
    Usage: a2x [OPTIONS] SOURCE_FILE 
    
    a2x: error: option -d: invalid choice: "book'" (choose from 'article', 'manpage', 'book') 
    done. 
    

    스크립트 로직입니다. Windows 7에서 실행되는 Cygwin64를 새로 설치합니다.

    FWIW - 해결 방법이 있습니다. 단어 책 뒤에 하나의 아포스트로피 앞에 공백을 추가하면 위의 오류가 발생합니다. 그러나 DBLATEX_OPTS의 -T에는 오류가있는 것으로 플래그가 지정됩니다.

    [[email protected] resources]$ makebook MyBook 
    Generating dblatex PDF output via a2x 
    a2x -v -f pdf -L --asciidoc-opts='-a lang=en -v -b docbook -d book ' --dblatex-opts='-V -T db2latex' MyBook.asciidoc 
    Usage: a2x [OPTIONS] SOURCE_FILE 
    a2x: error: no such option: -T 
    done. 
    

    에코 된 명령을 복사하고 명령 줄에서 실행하면 다시 작동합니다. 이것은 모두 매우 혼란 스럽습니다.

    답변

    3

    변수는 데이터를 포함해야하고, bash는 데이터를 데이터로 처리합니다. 이것은 따옴표와 같은 쉘 메타 문자도 데이터로 처리된다는 것을 의미합니다.

    주제에 대한 자세한 내용은 this article을 참조하십시오. 확인 eval 사용하지

    ASCIIDOC_OPTS=(--asciidoc-opts='-a lang=en -v -b docbook -d book') 
    DBLATEX_OPTS=(--dblatex-opts='-V -T db2latex') 
    cmd=(a2x -v -f pdf -L "${ASCIIDOC_OPTS[@]}" "${DBLATEX_OPTS[@]}" "$1".asciidoc) 
    # Print command in pastable format: 
    printf '%q ' "${cmd[@]}" 
    printf '\n' 
    # Execute it 
    "${cmd[@]}" 
    

    확인 :

    짧은 대답 대신 배열을 사용하는 것입니다

    eval "$cmd" #noooo 
    

    이 당신이 그것을 게시 된 코드와 함께 작동하도록 나타납니다,하지만주의 사항이있다 보안 문제.

    관련 문제