이중 앰퍼샌드 링크 조건이 마지막 링크 조건과 함께 백그라운드에서 실행되는 이유는 무엇입니까?

이중 앰퍼샌드 링크 조건이 마지막 링크 조건과 함께 백그라운드에서 실행되는 이유는 무엇입니까?

백그라운드 작업을 실행하려면 몇 가지 조건이 있습니다.

condition-command && condition-command && background-job &

문제는 다음과 같이 작업이 실행될 때까지 조건을 차단하고 싶다는 것입니다.

condition-command; condition-command; background-job &

하지만 이는 조건이 아니며, 이전 명령이 실패하면 작업이 실행되는 것을 원하지 않습니다.

나는 그것이 비동기적이라는 것을 알고 있지만 그렇지 않아야 합니다. 다음 두 스크립트는 동일해야 하지만 그렇지 않은 것 같습니다.

sleep 2; echo foo & sleep 1; echo bar; wait   # prints foo, then bar: correct
sleep 2 && echo foo & sleep 1; echo bar; wait # prints bar, then foo: bug

변수를 테스트하거나 마지막 변수를 서브셸에 넣으면 작동할 것이라는 것을 알고 있지만 $?(그런 다음 작업 제어를 잃고 데몬을 피하고 싶습니다) bash가 이 작업을 수행하는 이유와 수행 위치가 무엇인지 알고 싶습니다. 기록이 있나요? 이 동작을 방지할 수 있는 방법이 있나요?

편집하다:Chained if는 역겹기 때문에 대안으로 받아들이지 않습니다.
편집 2:서브쉘이 가능하다는 것을 알고 있지만 나에게는 작동하지 않습니다. 결국 여러 명령을 실행하고 싶다고 상상해 봅시다 wait. 디렉터리가 존재하는지 확인하면 가능 /proc/$PID하지만, 작업이 여러 개인 경우에는 번거롭습니다.
편집 3:주요 질문은 bash가 이것을 수행하는 이유와 이에 대한 문서가 어디에 있습니까? 어떤 해결책이든 아니든 보너스입니다!

답변1

배경을 전체 행에 적용하지 않으려면 다음을 사용하십시오 eval.

sleep 2 && eval 'sleep 10 &'

wait이제 두 번째 명령만 백그라운드 작업이며 실행할 수 있는 올바른 백그라운드 작업이 됩니다 .

답변2

편집 후: 질문의 &&우선순위가 높 &으므로 전체가 하나로 묶여 AND list배경과 같은 단위로 사용됩니다. 바라보다명령 목록매뉴얼에는 그다지 명확하지 않습니다.

원본 코드에 대한 최소한의 변경은 다음과 같습니다.

if condition-command && condition-command; then background-job & fi

(그것하나 if이지만 연결되지 않음).


오직

condition-command && condition-command && (background-job &)

그러면 문제가 해결될 것입니다.

답변3

[이것은 본질적으로 jimmij의 의견이 답변으로 바뀐 것입니다. ]

이를 사용하면 이전과 같이 하위 쉘을 만들지 { }않고도 일반 연산자 우선 순위를 무시할 수 있습니다. ( )따라서 다음을 사용하십시오.

condition-command && condition-command && { background-job & }

sleep/ 예 와 echo유사 :

sleep 2 && { echo foo & }; sleep 1; echo bar; wait # prints foo, then bar: correct

{and 는 and 와 같은 메타 }문자가 아닌 쉘 키워드이므로 명령 사이에 공백이 (필요하고 (명령 이름의 일부로 간주되지 않음) 기호와 같은 또는 앞에 명령 종료가 필요합니다(따라서 고려되지 않음). )또 다른 주장일 뿐임). 또한, 그 뒤에 다른 명령이 있는 경우에는 그 사이에 세미콜론(또는 다른 명령 구분 기호)을 사용해야 합니다.{&;}}

관련 정보