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

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

응답이 질문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] % 

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

&in의 bash우선순위가 in과 다른 것 같습니다 zsh. 즉, 명령은 다음과 같이 읽히는 것 같습니다.

(cd /tmp && echo A) & 

에서 bash와 같이

cd /tmp && (echo A &) 

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

답변1

다른 문서화된 동작zshmisc

리스트는 0개 이상의 하위 리스트로 구성된 시퀀스이며, 각 하위 리스트는 ;, &, &|, &!또는 개행 문자로 끝납니다. 목록이 (...)또는 내부에서 복잡한 명령으로 나타나는 경우 목록의 마지막 하위 목록에서 이 종결자를 선택적으로 생략할 수 있습니다 {...}. 하위 목록이 또는 개행 문자로 종료되면 ;쉘은 다음 하위 목록을 실행하기 전에 하위 목록이 완료될 때까지 기다립니다. 하위 목록이 , 또는 에 의해 종료되면 &&|&!백그라운드에서 마지막 파이프라인을 실행하고 완료될 때까지 기다리지 않습니다(백그라운드에서 전체 하위 목록을 실행하는 다른 셸과의 차이점에 유의하세요). 백그라운드 파이프라인은 0 상태를 반환합니다.

답변2

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

하위 목록이 &|' 또는 `&!'로 종료되면 &',쉘은 백그라운드에서 그 안에 있는 마지막 파이프라인을 실행합니다.

하위 목록의 다른 파이프라인이 현재 셸에서 실행된다는 것을 구체적으로 명시하지는 않지만 그것이 암시하는 것처럼 보이며 관찰된 동작은 그러한 해석을 뒷받침합니다. 예를 들어:

$ echo $foo $bar

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

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

관련 정보