bash 및 zsh에서 && vs &의 우선 순위


9

응답 이 질문에 나는에 행동 사이에 매우 재미 (미묘한) 차이를 발견 bash하고를 zsh:

에서 bash:

romano@RRyS:~$ pwd
/home/romano
romano@RRyS:~$ alias x="cd /bin && ./echo A >/dev/null  &"
romano@RRyS:~$ x
[1] 16611
romano@RRyS:~$ pwd
/home/romano

보시다시피, 별칭 실행은 x서브 쉘에서 수행되므로 현재 디렉토리는 변경되지 않습니다.

에 없음 zsh:

[romano:~] % pwd
/home/romano
[romano:~] % alias x="cd /bin && ./echo A >/dev/null &"
[romano:~] % x
[1] 16744
[1]  + 16744 done       ./echo A >/dev/null                                    
1& [romano:/bin] % pwd
/bin
[romano:/bin] % 

여기서 디렉토리가 변경되었습니다.

그것은 보인다 &에서가 bash보다 다른 우선 순위를 가지고 zsh내 말은 ---를, 명령과 같이 할 것

(cd /tmp && echo A) & 

에서 bash와 같은

cd /tmp && (echo A &) 

에서 zsh. 이것이 맞습니까? 아니면 다른 행동의 원인이 다른 것입니까?

답변:


9

다른 문서화 된 행동 zshmisc

목록은 각각의 서브리스트에 의해 종료되는 0 개 이상의 하위 목록의 서열이며 ;, &, &|, &!, 또는 개행. 이 터미네이터는 목록이 (...)또는 내부에 복잡한 명령으로 나타날 때 목록의 마지막 하위 목록에서 생략 될 수 있습니다 {...}. 서브리스트가 ;개행 또는 개행 으로 종료 되면, 쉘은 다음 서브리스트를 실행하기 전에 서브리스트가 완료되기를 기다립니다. 하위 목록이 종료 된 경우 &, &|또는 &!, 쉘은 백그라운드에서 그것의 마지막 파이프 라인을 실행하고, 완료 (백그라운드에서 전체 하위 목록을 실행 다른 조개의 차이에주의)까지 기다리지 않습니다. 백그라운드 파이프 라인은 상태 0을 반환합니다.


3

zshmisc(1)다음 줄이 묻혀 있습니다.

서브리스트가 &',& | '또는`&!'로 종료되면, 쉘은 백그라운드에서 마지막 파이프 라인을 실행합니다.

하위 목록의 다른 파이프 라인이 현재 셸에서 실행되었다고 구체적으로 명시되어 있지는 않지만 이것이 의미하는 것으로 보이며 관찰 한 동작이 해당 해석을 지원합니다. 예를 들면 다음과 같습니다.

$ echo $foo $bar

$ foo=3 && bar=5 && sleep 1 &
$ echo $foo $bar
3 5

또한 처음 두 파이프 라인이 현재 셸에서 실행되고 하위 목록의 마지막 파이프 라인 만 실제로 백그라운드에서 실행된다는 개념을 지원합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.