한 줄로 bash에서 여러 백그라운드 명령을 어떻게 실행합니까?


169

나는 보통 다음과 같은 여러 명령을 실행합니다.

sleep 2 && sleep 3

또는

sleep 2 ; sleep 3

그러나 하나의 명령 줄 명령으로 백그라운드에서 두 가지를 모두 실행하려면 어떻게해야합니까?

sleep 2 & && sleep 3 &

작동하지 않습니다. 그리고 어느 쪽도 대체하지 않습니다 &&와 함께;

그것을 할 수있는 방법이 있습니까?


8
()명령을 둘러싸는 데 사용 합니다.
nhahtdh

답변:


318

정확히 어떻게 달리기를 원하십니까? 백그라운드에서 시작하고 순차적으로 실행 하려면 다음과 같이하십시오.

(sleep 2; sleep 3) &

반면에 백그라운드 에서 병렬 로 실행 하려면 대신 다음을 수행하십시오.

sleep 2 & sleep 3 &

그리고 다음과 같은 두 가지 기술을 결합 할 수 있습니다.

(sleep 2; echo first finished) & (sleep 3; echo second finished) &

bash는 bash이기 때문에 때로는 동일한 작업을 수행하는 데는 여러 가지 다른 기술이 있지만 때로는 약간의 차이가 있습니다.


20
이것은 인생을 위해 "사람을 낚시로 가르치는"간결하고, 잘 생각 된 답변입니다. 감사.
ambrus

2
우리는 어떻게됩니까 sleep 2 && sleep 3 &? 나는 그것을 bash에서 시도했고 같은 방식으로 작동하는 것 같습니다 (에코로 시도).
Wajahat 2019

@HakanBaba, 예, 실제로 백그라운드에서 서브 쉘을 생성합니다.
Douwe van der Leest

3
@ Wajahat, 당신은 시도 했습니까 sleep 2 && echo "foo" && sleep 3 & echo "bar""? &&오퍼레이터는 이전 명령을 실행하도록 지시 쉘, 단지 오류없이 그 명령을 실행하면 쉘은 후속 명령을 실행한다. 치명적 오류가 아닌 한 이전 명령의 종료 상태에 관계없이 후속 명령을 실행할 수 ;있기 때문에 이는 본질적으로와 다릅니다 ;. 이 &명령은 쉘이 백그라운드에서 앞에있는 모든 "연결된"명령을 실행하도록 지시합니다. 여기서 "연결됨"은 명령이 파이프 ( |) 또는 논리 연산자의 일부임을 의미합니다 .
Douwe van der Leest

Of these list operators, ‘&&’ and ‘||’ have equal precedence, followed by ‘;’ and ‘&’, which have equal precedence.bash 매뉴얼에서.
jinbeom hong

49

마지막 버전에 일부 파렌을 추가해야합니다.

(sleep 2 &) && (sleep 3 &)

또는 이것도 작동합니다.

(sleep 2 &) ; (sleep 3 &)

참고 :와 함께 목록을 사용하면 &종료 상태는 항상 0입니다. 따라서 위의 두 경우는 똑같은 일을 수행합니다 (쉘은 차례로 비동기 적으로 양쪽을 실행합니다 ).
jinbeom hong

9

여러 백그라운드 명령을 실행하려면 &각 명령의 끝 을 추가해야합니다 . 전의: (command1 &) && (command2 &) && (command3 &)


5

위의 답변은 괄호를 사용합니다. Bash는 비슷한 목적으로 중괄호를 사용할 수도 있습니다.

{ sleep 2 && sleep 3; } &

중괄호는 구문에 대해 까다 롭습니다. 공백 뒤에 {, 공백 앞에 }및 마지막 세미콜론이 필요합니다. 경우에 따라 버팀대는 새 서브 쉘을 포크하지 않기 때문에보다 효율적입니다. 이 경우 차이가 있는지 모르겠습니다.


1
무엇에 대해 { sleep 2; sleep 3; } &?
Kenny Evitt

4

이것은 작동합니다 :

$(sleep 2 &) && sleep 3 &

또한 당신은 할 수 있습니다 :

$(sleep 2 && sleep 3) &

0

나도 같은 임무를 가지고 있습니다. 나는 시도했다 (sleep2 ; fg )& sleep3 ; fg가 일하고있다. 그리고 ctrl + c를 두 배로 만들면 두 프로세스가 중단 될 수 있습니다.


0

다음 $(command)과 같이 bash 명령 대체를 사용할 수 있습니다 .

$(command1 ; command2) &

stdin과 stdout은 여전히 ​​상위 프로세스에 연결되어 있으며 최소한 stdout을 리디렉션하는 것은 까다로울 수 있습니다. 또는 명령을 한 줄로 연결 한 다음 문자열을 bash명령에 전달 하여 실행을 처리 할 새 프로세스를 생성 할 수 있습니다.

bash -c "command1 ; command2" & 

백그라운드에서 여러 명령을 실행해야 할 때 bash 스크립트에서 특히 유용합니다.

이 두 문장은 동일해야합니다. 배시 프로세스는 명령 (명령 쇄) 및 처리하는 경우에 모두 산란되는 &끝이 실행을 분리한다.

추가 할 수있는이 시간 &>/dev/null전과 &표준 출력 적어도 리디렉션에 명령의 끝에와 부모 프로세스의 표준 출력에 출력을 피할 수 있습니다. 다음과 같은 것 :

bash -c "command1 ; command2" &>/dev/null &

-1

여러 명령을 순차적으로 실행하려면 실제로 어디에서나 작동하는 간단한 방법이 있습니다. 파일 만들기! 이 방법의 장점은 깨끗하고 단순하다는 것입니다.

먼저 이름을 가진 파일을 만드십시오 (예 :) commands.sh. 그런 다음 명령을 거기에 넣으십시오. 샘플은 다음과 같습니다.

commands.sh:

#!/system/bin/sh

sleep 3;
sleep 2;

이제 우리는 마지막 단계에 있습니다. 백그라운드에서 (순차적으로) 명령을 실행하려면 다음을 실행하십시오.

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