이유는 무엇 ; bash에서 예기치 않은 토큰 오류를 반환하고 반환합니까?


21

오류가 발생했습니다.

bash : 예기치 않은 토큰 근처의 구문 오류`; '

다음 명령으로 인해 :

evince foo.pdf bar.pdf &; emacs foo.tex &

백그라운드 작업 을 ;할 때 명령을 분리하는 것이 불법 &입니까? 아니면 이것이 작동하지 않는 또 다른 이유가 있습니까?

감사합니다.

답변:


40

세미콜론이 필요하지 않습니다. 배경으로 보낸 후에는 다른 명령을 자유롭게받을 수 있습니다.

evince foo.pdf bar.pdf & emacs foo.tex &

2
이것은 2 시간의 맹세 후에 if 문으로 도움이되었습니다. 누군가 이것을 if [ $(ps -ef |grep -c '[p]grep') -eq 0 ]; then nohup sleep 5 > /dev/null 2>&1</dev/null & fi
원한다면

13

BTW의 핵심 문제는 (Bourne-derived) 쉘이 빈 명령을 허용하지 않는다는 것입니다.

";" "&"는 명령 종결 자이며 각각 fg와 bg를 의미합니다. 그래서 ";;" (또는 줄의 시작 부분에 ";")도 유효하지 않습니다.

(아직 종료되지 않은 명령이있는 경우 줄 바꾸기를 계속하기 위해 "\"를 사용하지 않는 한 줄 바꿈은 ";"을 의미합니다.)

언어는 다음 정책에 따라 크게 다릅니다.

C 파생 언어는 빈 문장을 허용합니다.

파스칼과 PERL에는 터미네이터가 아닌 세퍼레이터가 있습니다.


-3

아니요, 혼란스럽고 의미하는 바를 제대로 해결할 수 없습니다.

백그라운드에 넣고 자하는 명령으로 &를 그룹화해야합니다.

$ (evince foo.pdf bar.pdf &); emacs foo.tex &

잘 작동합니다. 더 명백한 것은 다음과 같습니다.

$ (evince foo.pdf bar.pdf &); (emacs foo.tex &)

특히 종료 후 더 많은 명령을 연결하려는 경우 특히 그렇습니다.


1
불필요한 세미콜론 사용을 정당화하기 위해 서브 쉘을 생성 할 필요가 없습니다. 괄호는 단순한 구문이 아닙니다. 그들은 추가 작업을 수행합니다.
chepner 2016 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.