2016-09-27 2 views
1

단일 명령으로 내 C 및 Java 프로그램을 컴파일하고 실행하기 위해이 스크립트를 작성했습니다.쉘 스크립트가 '}'매달려 실행되는 이유는 무엇입니까?

 1 run(){ 
    2  gcc -lm $1 && (shift; ./a.out $*) 
    3  } 
    4 
    5 jrun(){ 
    6  clas=`echo $1 | cut -d'.' -f1 ` 
    7  javac $1 && { shift; java $clas $* } 
    8 } 

하지만 실행 중 오류가 발생했습니다.

# source t.sh 
-bash: t.sh: line 9: syntax error: unexpected end of file 

끝에 '}'을 추가하면 스크립트가 성공적으로 실행됩니다.

대신 () 대신 {}을 사용함을 알게되었습니다.

제 질문은 달리고 '}'과 함께 잘 작동하는 이유는 무엇입니까?

+0

아무것도 없습니다. 마지막'}'은'jrun {}'을 완성합니다. – VM17

+0

줄 번호가있는 코드는 게시하지 마십시오. – tripleee

+0

오류는 줄 번호를 나타 내기 때문에 줄 번호가있는 게시물. – Yogesh

답변

5

중괄호를 분리하려면 $* 뒤에 세미콜론이 필요합니다. 그대로, 그것은 단순히 javac의 인수로 해석됩니다.

여담으로

, 당신은 아마 많은 인용 문제를 해결하고, 약간 서투른 화합물 명령을 방지

run(){ 
    gcc -lm "$1" || return 
    shift 
    ./a.out "[email protected]" 
    } 

jrun(){ 
    javac "$1" || return 
    local clas=${1%.*} 
    shift 
    java "$clas" "[email protected]" 
} 

찾고 있습니다. local 선언은 함수가 동일한 이름을 가진 전역 변수를 포착하지 못하도록하지만 bashism입니다.

+0

더 나아가, 이것은 마치 그것이'Makefile'이되고 싶어하는 것처럼 막연하게 보입니다. – tripleee

3

문제는 블록에 있습니다. 세미콜론이 없습니다.

그것은이 예를 재현 할 수 있습니다 :이 대화 형 터미널에서 실행하는 경우

true && { echo } # missing semicolon 

는, 쉘은 추가 입력을 수신 대기 남아있을 것입니다. 당신이 추가 닫는 괄호를 입력하면, 다음 echo }의 출력이 표시됩니다 인해 쉘 구문 분석하는 방식

} 

을, 마지막 문장과 전 중괄호 사이에 줄 바꿈 또는 세미콜론이있을 필요가있다 블록의 끝. 그것을 실행하고 danging '}'로 잘 작동하는 이유

true && { echo; } # works 
3

내 질문은?

아니요. 당신이 제시 한 코드는 입니다. 하나는 }입니다. bash을 수락하기 전에 하나를 추가해야합니다.

문제는 라인 (7)에 :

javac $1 && { shift; java $clas $* } 

{} 쉘 메타 문자 수 없습니다. 그 중요성은 상황에 따라 다르며, 특히 이스케이프 처리되지 않은 일반적인 쉘 단어로 표시 될 수 있습니다. 결함 라인의 }은 따라서 닫는 중괄호가 아닌 java 명령에 대한 인수입니다.

javac $1 && { shift; java $clas $*; } 

나이 :

javac $1 && { 
     shift 
     java $clas $* 
    } 

또는 그 몇 가지 변화 당신도이 원하는.

관련 문제