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